60 std::mutex releaseMutex;
61 std::condition_variable releaseCv;
63 std::atomic<bool> workerEntered{
false };
64 std::atomic<bool> workerFinished{
false };
70 workerEntered.store(
true, std::memory_order_release );
72 std::unique_lock<std::mutex> lock( releaseMutex );
73 releaseCv.wait( lock, [&]() {
return release; } );
76 workerFinished.store(
true, std::memory_order_release );
82 while( !workerEntered.load( std::memory_order_acquire ) )
83 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
85 auto start = std::chrono::steady_clock::now();
86 size_t stuck = registry.
JoinAll( std::chrono::milliseconds( 100 ) );
87 auto elapsed = std::chrono::steady_clock::now() - start;
90 BOOST_CHECK( elapsed < std::chrono::seconds( 2 ) );
97 std::lock_guard<std::mutex> lock( releaseMutex );
101 releaseCv.notify_all();
108 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
109 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
111 BOOST_CHECK( workerFinished.load() );
118 std::mutex releaseMutex;
119 std::condition_variable releaseCv;
120 bool release =
false;
121 std::atomic<bool> workerEntered{
false };
122 std::atomic<bool> workerFinished{
false };
131 workerEntered.store(
true, std::memory_order_release );
134 std::unique_lock<std::mutex> lock( releaseMutex );
135 releaseCv.wait( lock, [&]() {
return release; } );
141 workerFinished.store(
true, std::memory_order_release );
144 while( !workerEntered.load( std::memory_order_acquire ) )
145 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
153 std::lock_guard<std::mutex> lock( releaseMutex );
157 releaseCv.notify_all();
163 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
164 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
166 BOOST_CHECK( workerFinished.load() );
196 std::atomic<bool> workRan{
false };
198 bool accepted = registry.
Register(
"late",
199 [&workRan]() { workRan.store(
true ); } );
201 BOOST_CHECK( !accepted );
205 std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );
206 BOOST_CHECK( !workRan.load() );
214 auto payload = std::make_unique<int>( 42 );
215 std::atomic<int> observed{ 0 };
219 [payload = std::move( payload ), &observed]()
mutable
221 observed.store( *payload, std::memory_order_release );
224 BOOST_CHECK( accepted );
BOOST_CHECK_EQUAL(result, "25.4")