什么时候应该使用 std::thread::joinable
When should you use std::thread::joinable?
在
网站上声明了cpp首选项关于std::thread::joinable:
检查线程对象是否标识活动执行线程。 具体来说,如果 get_id(( != std::thread::id((,则返回 true。所以一个 默认构造的线程不可联接。已完成的线程 正在执行但尚未联接的代码仍被视为 活动执行线程,因此是可连接的。
std::thread::join 文档中的内容如下:
错误条件
resource_deadlock_would_occur 如果这个->get_id(( == std::this_thread::get_id(( (检测到死锁(
这种方法的唯一目的是检测这种情况吗? 我们目前厚颜无耻地只调用线程>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;
};
<</div>
div class="answers">当您有一个可能已经联接的std::thread
对象,或者可能没有引用实际的 thread of execution(TOE - 即操作系统线程(时,您可以使用joinable
,并且如果尚未加入,则想要加入它。
例如,如果你正在实现提议的joinable_thread
类,那么析构函数会说if(thr.joinable()) thr.join();
,以涵盖有人已经显式调用join
的情况。
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 嵌入式设备 -> std::thread -> FreeRTOS?
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- C++ - Thread Pool
- 为什么参数在构造 std::thread 时移动两次
- std::thread::_Invoker 使用线程编程时出错
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 什么时候应该使用 std::thread::joinable