22#include < tbb/task_arena.h>
33
44#include < boost/capy.hpp>
5- #include < condition_variable>
65#include < cstddef>
76#include < iostream>
8- #include < mutex >
7+ #include < latch >
98#include < string_view>
109
1110#include " capy_stream_await.hpp" // StreamIoAwaitable
@@ -167,27 +166,17 @@ int main() {
167166 std::cout << " --- Single event, synchronous wait for completion ---\n " ;
168167 cudaStream_t stream;
169168 ERROR_CHECK_CUDA (cudaStreamCreate (&stream));
170- auto condition = std::condition_variable ();
171- auto mutex = std::mutex ();
172169 auto final_result = tools::StatusCode{};
173- auto result_handler = [&condition, &mutex,
174- &final_result](tools::StatusCode code) {
175- {
176- std::lock_guard lock (mutex);
177- final_result = code;
178- }
179- condition.notify_one ();
170+ auto done = std::latch{1 };
171+ auto result_handler = [&done, &final_result](tools::StatusCode code) {
172+ final_result = code;
173+ done.count_down ();
180174 };
181175
182176 log () << " main Launching algorithm..." << std::endl;
183177 boost::capy::run_async (executor,
184178 result_handler)(reconstruct (stream, " main" ));
185- {
186- auto lock = std::unique_lock (mutex);
187- condition.wait (lock, [&final_result]() {
188- return final_result != tools::StatusCode::UNDEFINED ;
189- });
190- }
179+ done.wait ();
191180 log () << " main Final status of algorithm " << final_result << " "
192181 << std::endl;
193182 ERROR_CHECK_CUDA (cudaStreamDestroy (stream));
@@ -202,31 +191,18 @@ int main() {
202191 ERROR_CHECK_CUDA (cudaStreamCreate (&stream));
203192 }
204193
205- auto condition = std::condition_variable ();
206- auto mutex = std::mutex ();
207- auto counter = streams.size ();
194+ auto done = std::latch{static_cast <std::ptrdiff_t >(streams.size ())};
208195 log () << " main Launching algorithms..." << std::endl;
209196
210197 for (std::size_t i = 0 ; i < streams.size (); ++i) {
211- auto result_handler = [&condition, &mutex, &status, &counter,
212- i](tools::StatusCode code) {
213- auto done = false ;
214- {
215- std::lock_guard lock (mutex);
216- status.at (i) = code;
217- done = (--counter == 0 );
218- }
219- if (done) {
220- condition.notify_one ();
221- }
198+ auto result_handler = [&done, &status, i](tools::StatusCode code) {
199+ status.at (i) = code;
200+ done.count_down ();
222201 };
223202 boost::capy::run_async (executor, result_handler)(
224203 reconstruct (streams.at (i), " event" + std::to_string (i)));
225204 }
226- {
227- auto lock = std::unique_lock (mutex);
228- condition.wait (lock, [&counter]() { return counter == 0 ; });
229- }
205+ done.wait ();
230206 for (auto & stream : streams) {
231207 ERROR_CHECK_CUDA (cudaStreamDestroy (stream));
232208 }
0 commit comments