[英]When should you use std::thread::joinable?
关于std :: thread :: joinable的网站cppreference中陈述了:
检查线程对象是否标识了活动的执行线程。 具体来说,如果get_id()!= std :: thread :: id(),则返回true。 因此默认构造的线程不可连接。 已完成执行代码但尚未加入的线程仍被视为活动执行线程,因此可以连接。
关于std :: thread :: join文档的内容如下:
错误条件
resource_deadlock_would_occur如果this-> get_id()== std :: this_thread :: get_id()(检测到死锁)
这种方法的唯一目的是检测这种情况吗? 我们目前肆无忌惮地只调用thread-> join而没有可连接的包装器,这种方法有什么危险?
您可以使用joinable
,当你有一个std::thread
可能已经被加入了对象,也可以不引用实际的牛逼 hread 华氏度 éxecution(TOE -即OS线程),并且你想加入它,如果不是已经加入。
例如,如果你正在实现建议的joinable_thread
类,那么析构函数会说if(thr.joinable()) thr.join();
,以涵盖有人已经明确join
的情况。
根据您引用的信息:
因此默认构造的线程不可连接。
有你的答案。 如果你不知道你的线程是否是默认构造的,你不知道它是否可以连接。
因此,在程序/函数/例程的末尾,当您想要加入线程时(并且您需要在std::thread
超出范围之前执行此操作),您必须有条件地执行此操作。 这就是你如何做到的。
#include <thread>
void bar(const unsigned int);
/**
* This class may be default-constructed (in which case it does nothing),
* or constructed with an `unsigned int` argument which shall be passed
* to `bar()` in a worker thread.
*/
struct Foo
{
Foo() {}
Foo(const unsigned int x)
: doThingsThread([&]() { bar(x); })
{}
~Foo()
{
// The thread *MUST* be joined before destruction, if it
// is joinable. Otherwise, it *CAN'T* be joined.
if (doThingsThread.joinable())
doThingsThread.join();
}
private:
std::thread doThingsThread;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.