64 std::mutex releaseMutex;
65 std::condition_variable releaseCv;
67 std::atomic<bool> workerEntered{
false };
73 workerEntered.store(
true, std::memory_order_release );
75 std::unique_lock<std::mutex> lock( releaseMutex );
76 releaseCv.wait( lock, [&]() {
return 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();
105 std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) );
113 std::mutex releaseMutex;
114 std::condition_variable releaseCv;
115 bool release =
false;
116 std::atomic<bool> workerEntered{
false };
117 std::atomic<bool> workerFinished{
false };
126 workerEntered.store(
true, std::memory_order_release );
128 std::unique_lock<std::mutex> lock( releaseMutex );
129 releaseCv.wait( lock, [&]() {
return release; } );
131 workerFinished.store(
true, std::memory_order_release );
134 while( !workerEntered.load( std::memory_order_acquire ) )
135 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
143 std::lock_guard<std::mutex> lock( releaseMutex );
147 releaseCv.notify_all();
151 for(
int i = 0; i < 200 && !workerFinished.load( std::memory_order_acquire ); ++i )
152 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
154 BOOST_CHECK( workerFinished.load() );
184 std::atomic<bool> workRan{
false };
186 bool accepted = registry.
Register(
"late",
187 [&workRan]() { workRan.store(
true ); } );
189 BOOST_CHECK( !accepted );
193 std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );
194 BOOST_CHECK( !workRan.load() );
202 auto payload = std::make_unique<int>( 42 );
203 std::atomic<int> observed{ 0 };
207 [payload = std::move( payload ), &observed]()
mutable
209 observed.store( *payload, std::memory_order_release );
212 BOOST_CHECK( accepted );
BOOST_CHECK_EQUAL(result, "25.4")