gpt4 book ai didi

c++ - 如何检查线程是否已在 C++11 及更高版本中完成工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:04 24 4
gpt4 key购买 nike

如何在 C++11 及更高版本中检查线程是否已完成工作?我一直在阅读文档并编写了以下代码:

#include <iostream>
#include <thread>
void mythread()
{
//do some stuff
}
int main()
{
std::thread foo(mythread);
if (foo.joinable())
{
foo.join();
//do some next stuff
}
}

joinable 只告诉线程已经开始工作,但我想知道如何编写代码来检查线程是否完成工作。

例如:

#include <iostream>
#include <thread>
void mythread()
{
//do some stuff
}
int main()
{
std::thread foo(mythread);
if (foo.finishedWork())
{
foo.join();
//do some next stuff
}
}

最佳答案

您可能想使用 std::future ,它提供了更高级别的设施,您可以在其中轻松检查异步计算是否完成(也称为准备就绪):示例:

void mythread() {
//do some stuff
}

template<typename T>
bool future_is_ready(std::future<T>& t){
return t.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}

int main()
{
std::future<void> foo = std::async(std::launch::async, mythread);
if (future_is_ready(foo)){
//do some next stuff
}
}

另一方面,您可能认为简单地使用“安全”(或原子)标志是可行的:

#include <iostream>
#include <thread>

std::atomic<bool> is_done{false};

void mythread()
{
//do some stuff
......
is_done = true;
}
int main()
{
std::thread foo(mythread);
if (is_done)
{
foo.join();
//do some next stuff
}
.....
if(foo.joinable()) foo.join();
}

但是,它不起作用。当您认为 is_done = true 是您在 mythread() 中所做的最后一件事时;您可能已经在该范围内创建了一些自动存储持续时间的对象,并且由于这些对象以相反的构造顺序被销毁,因此在设置 后该线程中仍然会有“一些工作” is_done.

关于c++ - 如何检查线程是否已在 C++11 及更高版本中完成工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42418360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com