使用 std::thread 时,监视其执行至关重要有效线程管理的状态。但是,joinable() 方法并不是为了确定线程是否仍在运行而设计的。相反,本文提出了各种独立于平台的方法来满足这一需求。
对于那些熟悉 C 11、std::async 和 std 的人::未来提供方便的解决方案。使用 std::future::wait_for(0ms),您可以通过检查返回的状态值来检查线程的状态:
#include <future> #include <thread> int main() { auto future = std::async(std::launch::async, [] { std::this_thread::sleep_for(3s); return 8; }); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } auto result = future.get(); }
如果 std::async 不是一个选项,你可以使用 std::promise 来获得 future对象:
#include <future> #include <thread> int main() { std::promise<bool> p; auto future = p.get_future(); std::thread t([&p] { std::this_thread::sleep_for(3s); p.set_value(true); }); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); }
C 11 及更高版本的一个简单方法是利用布尔原子标志:
#include <atomic> #include <thread> int main() { std::atomic<bool> done(false); std::thread t([&done] { std::this_thread::sleep_for(3s); done = true; }); // Check thread status if (done) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); }
另一个选择是利用 std::packaged_task,它提供了一种更干净的替代方法std::promise:
#include <future> #include <thread> int main() { std::packaged_task<void()> task([] { std::this_thread::sleep_for(3s); }); auto future = task.get_future(); std::thread t(std::move(task)); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { // ... } t.join(); }
这些技术可以让你有效地监控 std::thread 的执行状态,确保在各种场景下得到正确的处理。
以上是如何有效地检查'std::thread”是否仍在 C 中运行?的详细内容。更多信息请关注PHP中文网其他相关文章!