首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11智能指针中存储std::线程

在C++11智能指针中存储std::线程
EN

Stack Overflow用户
提问于 2017-06-29 17:59:59
回答 2查看 8.8K关注 0票数 9

C++ 11 &之上,在将std::thread直接存储为类的成员时有哪些优点或缺点:

代码语言:javascript
复制
std::thread my_thread;

与将std::shared_ptrstd::unique_ptr存储到线程相反,如下所示:

代码语言:javascript
复制
std::shared_ptr<std::thread> my_thread_ptr;

有任何代码选项比其他代码更好吗?或者没关系,只有两种不同的方式来处理线程对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-29 22:32:39

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

  • 我们可能希望对对象的生存期有更多的控制,例如“懒惰地”初始化它。std::thread已经支持它了。它可以在“不代表线程”状态下进行,稍后在需要时分配真正的线程,并且在销毁之前必须显式地使用joined或detacheded。
  • 我们可能希望一个成员被转移到/从其他所有权。因为std::thread已经支持移动和交换,因此不需要指针。
  • 我们可能希望指向的对象是动态多态的。这不适用,因为std::thread没有任何虚拟成员函数。
  • 我们可能需要用于隐藏实现细节和减少依赖关系的不透明指针,但std::thread是标准库类,因此不能使其不透明。
  • 我们可能希望拥有共同的所有权。这是std::thread的脆弱场景。多个所有者谁可以分配,交换,分离或加入它(没有太多的其他操作与线程)可能会造成复杂。
  • 在销毁之前必须进行清理,如if (xthread.joinable()) xthread.join();xthread.detach();。在拥有类的析构函数中,这也更健壮,更容易阅读,而不是将相同的东西转换为智能指针的删除器的代码。

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

票数 13
EN

Stack Overflow用户

发布于 2017-06-29 19:22:20

如果您可以选择std::线程作为成员变量,那么就选择它。如果不是,考虑其他选择。不要将其包装在std::shared_ptrstd::unique_ptr中,除非您有认真的理由这样做。考虑到std::thread本身是可移动的,将其封装到智能指针中是非常不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44832054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档