37 std::atomic<int> counter{ 0 };
39 for(
int i = 0; i < 4; ++i )
41 registry.
Register(
"fast-" + std::to_string( i ),
44 std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
45 counter.fetch_add( 1, std::memory_order_relaxed );
49 size_t stuck = registry.
JoinAll( std::chrono::seconds( 2 ) );
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 ) );
96 std::lock_guard<std::mutex> lock( releaseMutex );
100 releaseCv.notify_all();
107 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
108 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
110 BOOST_CHECK( workerFinished.load() );
116 std::mutex releaseMutex;
117 std::condition_variable releaseCv;
118 bool release =
false;
119 std::atomic<bool> workerEntered{
false };
120 std::atomic<bool> workerFinished{
false };
129 workerEntered.store(
true, std::memory_order_release );
132 std::unique_lock<std::mutex> lock( releaseMutex );
133 releaseCv.wait( lock, [&]() {
return release; } );
139 workerFinished.store(
true, std::memory_order_release );
142 while( !workerEntered.load( std::memory_order_acquire ) )
143 std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
151 std::lock_guard<std::mutex> lock( releaseMutex );
155 releaseCv.notify_all();
161 for(
int i = 0; i < 1000 && !workerFinished.load( std::memory_order_acquire ); ++i )
162 std::this_thread::sleep_for( std::chrono::milliseconds( 5 ) );
164 BOOST_CHECK( workerFinished.load() );
194 std::atomic<bool> workRan{
false };
196 bool accepted = registry.
Register(
"late",
197 [&workRan]() { workRan.store(
true ); } );
199 BOOST_CHECK( !accepted );
203 std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );
204 BOOST_CHECK( !workRan.load() );
212 auto payload = std::make_unique<int>( 42 );
213 std::atomic<int> observed{ 0 };
217 [payload = std::move( payload ), &observed]()
mutable
219 observed.store( *payload, std::memory_order_release );
222 BOOST_CHECK( accepted );
BOOST_CHECK_EQUAL(result, "25.4")