【问题标题】:Storing an std::thread in C++11 smart pointer在C ++ 11智能指针中存储STD :: Thread
【发布时间】:2017-12-03 13:31:23
【问题描述】:

C++ 11 及以上有什么优点或缺点,当像这样直接将std::thread 存储为类成员时:

std::thread my_thread;

与像这样将std::shared_ptrstd::unique_ptr 存储到线程相反:

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

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

【问题讨论】:

  • 优点或缺点不是很明显吗?看看thread 的特殊成员函数做了什么,然后决定这是否是你想要的外部类的行为。
  • 为什么要将它存储在std::shared_ptrstd::unique_ptr 中?没看明白,std::thread 只是包装了实现定义的线程句柄。
  • 这似乎是一个列表问题。而是针对具体案例提出一些具体问题并解释您的限制条件。
  • @NicolBolas 我不是在谈论形成外部类。我的意思是 - 有一个类需要线程在其对象的生命周期内完全活着,但不包装线程。所以线程对象是一个成员。现在我的问题是“当线程对象是类成员时,将其存储在智能指针中是否有优势”。不知道你对这个简单的问题有什么误解

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 共享所有权确实是我现在唯一能想到的用例
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2014-03-10
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多