Opened 6 years ago
#12690 new Bugs
Boost Asio race condition
| Reported by: | Owned by: | chris_kohlhoff | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | asio |
| Version: | Boost 1.62.0 | Severity: | Problem |
| Keywords: | race condition | Cc: |
Description
The following test case issues an warning when executed with the thread sanitizer. The problem occurs when there is a pending job and the associated work is canceled.
BOOST_AUTO_TEST_CASE(ioServiceShallWaitForPendingJobs)
{
auto test = []()
{
boost::asio::io_service service;
std::unique_ptr<boost::asio::io_service::work> work
(new boost::asio::io_service::work(service));
std::thread t(
[&service]()
{
service.run();
}
);
std::atomic_bool called{false};
service.post(
[&called]()
{
std::this_thread::sleep_for (std::chrono::milliseconds(50));
called = true;
}
);
std::this_thread::sleep_for (std::chrono::milliseconds(1));
work.reset(); // -> race
t.join();
BOOST_REQUIRE(called);
};
for( size_t i = 0 ; i < 100000; ++i)
{
BOOST_TEST_MESSAGE(i);
test();
}
}
The fix is in asio/detail/posix_event.hpp:55
// Signal the event and unlock the mutex.
template <typename Lock>
void signal_and_unlock(Lock& lock)
{
BOOST_ASIO_ASSERT(lock.locked());
signalled_ = true;
// lock.unlock();
::pthread_cond_signal(&cond_); // Ignore EINVAL.
lock.unlock(); // first signal and then unlock as the name implies
}
Please find the output of the Clang as an attachment
Attachments (1)
Note:
See TracTickets
for help on using tickets.
