在C ++ 11智能指针中存储std :: thread

时间:2017-06-29 17:59:59

标签: c++ c++11 c++14 shared-ptr stdthread

C++ 11&将std::thread直接存储为类的成员时,有什么优缺点

std::thread my_thread;

与将std::shared_ptrstd::unique_ptr存储到线程中相反:

std::shared_ptr<std::thread> my_thread_ptr;

是否有任何代码选项比其他代码更好?或者无关紧要,只需2种不同的方式来处理线程对象。

2 个答案:

答案 0 :(得分:10)

使用指针(或智能指针)成员可能有一些不常见的原因,但对于常见用法,std::thread似乎不适用或本身具有足够的灵活性:

  • 我们可能希望更多地控制对象的生命周期,例如初始化它&#34;懒惰&#34;。 std::thread已经支持它。它可以在&#34;不代表线程&#34;状态,在需要时稍后分配实际线程,并且必须在销毁之前明确joindetached
  • 我们可能希望将成员转移到其他所有权或从其他所有权转移。因为std::thread已经支持移动和交换,所以不需要指针。
  • 我们可能希望指向的对象是动态多态的。这不适用,因为std::thread没有任何虚拟成员函数。
  • 我们可能希望使用opaque指针隐藏实现细节并减少依赖关系,但std::thread是标准库类,因此我们无法使其不透明。
  • 我们可能希望拥有共享权。这是std::thread的脆弱情况。可以分配,交换,分离或加入它的多个所有者(并且线程没有太多其他操作)会导致复杂化。
  • 在销毁前必须进行强制清理,例如if (xthread.joinable()) xthread.join();xthread.detach();。这在拥有类的析构函数中也更强大,更容易阅读,而不是将相同的东西用于智能指针删除的代码。

因此,除非有一些不寻常的原因,否则我们应该直接使用线程作为数据成员。

答案 1 :(得分:1)

如果您可以选择将std :: thread作为成员变量,请选择它。如果没有,请考虑其他选择。除非您有充分理由这样做,否则不要将其包裹在std::shared_ptrstd::unique_ptr内。鉴于std::thread本身是可移动的,因此将其包装成智能指针的可能性非常小。