64 std::mutex releaseMutex;
65 std::condition_variable releaseCv;
67 std::atomic<bool> workerEntered{
false };
68 std::atomic<bool> workerFinished{
false };
74 workerEntered.store(
true, std::memory_order_release );
76 std::unique_lock<std::mutex> lock( releaseMutex );
77 releaseCv.wait( lock, [&]() {
return release; } );
80 workerFinished.store(
true, std::memory_order_release );
86 while( !workerEntered.load( std::memory_order_acquire ) )
87 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
89 auto start = std::chrono::steady_clock::now();
90 size_t stuck = registry.
JoinAll( std::chrono::milliseconds( 100 ) );
91 auto elapsed = std::chrono::steady_clock::now() - start;
94 BOOST_CHECK( elapsed < std::chrono::seconds( 2 ) );
101 std::lock_guard<std::mutex> lock( releaseMutex );
105 releaseCv.notify_all();
112 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
113 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
115 BOOST_CHECK( workerFinished.load() );
122 std::mutex releaseMutex;
123 std::condition_variable releaseCv;
124 bool release =
false;
125 std::atomic<bool> workerEntered{
false };
126 std::atomic<bool> workerFinished{
false };
135 workerEntered.store(
true, std::memory_order_release );
138 std::unique_lock<std::mutex> lock( releaseMutex );
139 releaseCv.wait( lock, [&]() {
return release; } );
145 workerFinished.store(
true, std::memory_order_release );
148 while( !workerEntered.load( std::memory_order_acquire ) )
149 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
157 std::lock_guard<std::mutex> lock( releaseMutex );
161 releaseCv.notify_all();
167 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
168 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
170 BOOST_CHECK( workerFinished.load() );
200 std::atomic<bool> workRan{
false };
202 bool accepted = registry.
Register(
"late",
203 [&workRan]() { workRan.store(
true ); } );
205 BOOST_CHECK( !accepted );
209 std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );
210 BOOST_CHECK( !workRan.load() );
218 auto payload = std::make_unique<int>( 42 );
219 std::atomic<int> observed{ 0 };
223 [payload = std::move( payload ), &observed]()
mutable
225 observed.store( *payload, std::memory_order_release );
228 BOOST_CHECK( accepted );
BOOST_CHECK_EQUAL(result, "25.4")