std :: threadがまだ実行されているかどうかを確認する方法(cross-platform)
std ::スレッドで作業する場合、効果的なスレッド管理のために実行状況を監視することが重要です。ただし、Joinable()メソッドは、スレッドがまだ実行されているかどうかを判断するために設計されていません。代わりに、この記事では、このニーズに対処するためのさまざまなプラットフォームに依存しない方法を紹介します。 std :: future :: wait_for(0ms)を使用すると、返されたステータス値を調べてスレッドのステータスを確認できます。
#include
int main(){
Auto Future = std :: async(std :: launch :: async、[] {
std :: this_thread :: sleep_for(3s);
8を返します。
});
//スレッドステータスを確認します
auto status = future.wait_for(0ms);
if(status == std :: future_status :: ready){
std :: cout std :: promise(std :: threadを使用)
std :: asyncがオプションでない場合、将来のオブジェクトを取得することを約束することができます:
#include
#include
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 std :: atomic を使用してstd :: thread
c 11以降の簡単なアプローチは、ブールアトミックフラグを利用することです:
#include
#include
int main() {
std::promise 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 std :: packaged_task(std :: threadを使用)
は、std :: packaged_taskを活用することです。
#include
int main(){
std :: packaged_task task([] {
std :: this_thread :: sleep_for(3s);
});
auto future = task.get_future();
std :: thread t(std :: move(task));
//スレッドステータスを確認します
auto status = future.wait_for(0ms);
if(status == std :: future_status :: ready){
// ...
}
T.Join();
}
#include
#include
int main() {
std::atomic done(false);
std::thread t([&done] {
std::this_thread::sleep_for(3s);
done = true;
});
// Check thread status
if (done) {
std::cout