使用 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 <h3>使用 std::promise (与 std::thread 一起)</h3> <p>如果 std::async 不是一个选项,你可以使用 std::promise 来获得 future对象:</p> <pre class="brush:php;toolbar:false">#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 <h3>使用 std::atomic<bool>;与 std::thread</bool> </h3> <p>C 11 及更高版本的一个简单方法是利用布尔原子标志:</p> <pre class="brush:php;toolbar:false">#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 <h3>使用 std::packaged_task (与 std::thread)</h3> <p>另一个选择是利用 std::packaged_task,它提供了一种更干净的替代方法std::promise:</p> <pre class="brush:php;toolbar:false">#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(); }</void></thread></future>
这些技术可以让你有效地监控 std::thread 的执行状态,确保在各种场景下得到正确的处理。
以上是如何有效地检查'std::thread”是否仍在 C 中运行?的详细内容。更多信息请关注PHP中文网其他相关文章!