C++ 11
&将std::thread
直接存储为类的成员时,有什么优缺点:
std::thread my_thread;
与将std::shared_ptr
或std::unique_ptr
存储到线程中相反:
std::shared_ptr<std::thread> my_thread_ptr;
是否有任何代码选项比其他代码更好?或者无关紧要,只需2种不同的方式来处理线程对象。
答案 0 :(得分:10)
使用指针(或智能指针)成员可能有一些不常见的原因,但对于常见用法,std::thread
似乎不适用或本身具有足够的灵活性:
std::thread
已经支持它。它可以在&#34;不代表线程&#34;状态,在需要时稍后分配实际线程,并且必须在销毁之前明确join
或detached
。std::thread
已经支持移动和交换,所以不需要指针。std::thread
没有任何虚拟成员函数。std::thread
是标准库类,因此我们无法使其不透明。 std::thread
的脆弱情况。可以分配,交换,分离或加入它的多个所有者(并且线程没有太多其他操作)会导致复杂化。if (xthread.joinable()) xthread.join();
或xthread.detach();
。这在拥有类的析构函数中也更强大,更容易阅读,而不是将相同的东西用于智能指针删除的代码。因此,除非有一些不寻常的原因,否则我们应该直接使用线程作为数据成员。
答案 1 :(得分:1)
如果您可以选择将std :: thread作为成员变量,请选择它。如果没有,请考虑其他选择。除非您有充分理由这样做,否则不要将其包裹在std::shared_ptr
或std::unique_ptr
内。鉴于std::thread
本身是可移动的,因此将其包装成智能指针的可能性非常小。