在使用 C 开发多线程应用程序时,通常需要确定给定 std:: 的运行状态线。然而,std::thread 缺乏方便的 timed_join() 方法,并且 joinable() 专门不适用于此目的。
C 11 解决方案
如果您正在使用 C 11,一个优雅的解决方案是使用 std::async 和 std::future。 std::future 的 wait_for 函数使您能够以简洁的方式检查线程状态:
#include <future> #include <thread> auto future = std::async(std::launch::async, [] { ... }); // Run task on a new thread // Check thread status with zero milliseconds wait time auto status = future.wait_for(0ms); if (status == std::future_status::ready) // Thread finished else // Thread still running
使用 std::promise
对于 std::线程,你可以利用 std::promise 来获得 future object:
#include <future> #include <thread> std::promise<bool> p; auto future = p.get_future(); std::thread t([&p] { ...; p.set_value(true); }); // Run task on a new thread // Get thread status using wait_for auto status = future.wait_for(0ms);
原子标志方法
另一个简单的选项是使用原子标志:
#include <thread> #include <atomic> std::atomic<bool> done(false); std::thread t([&done] { ...; done = true; }); // Run task with flag setting if (done) // Thread finished else // Thread still running
Std: :packaged_task
对于更干净的解决方案,请考虑std::packaged_task:
#include <future> #include <thread> std::packaged_task<void()> task([] { ... }); auto future = task.get_future(); std::thread t(std::move(task)); // Run task on new thread // Check thread status using wait_for auto status = future.wait_for(0ms);
通过利用这些方法,您可以有效地检查 std::thread 是否仍在运行,确保多线程应用程序中更好的控制和协调。
以上是如何高效地检查C中std::thread的运行状态?的详细内容。更多信息请关注PHP中文网其他相关文章!