可以替换std :: thread对象吗?

时间:2015-05-18 17:13:05

标签: c++ variable-assignment stdthread

根据我在C ++在线文档中收集的内容,分配给已连接的 std :: thread 对象应调用其析构函数并表示合法操作。是这种情况吗?

这里有一些例子来说明我的意思:

#include <thread>
#include <vector>

using namespace std;

int main()
{
    vector<thread> tvec;
    for(int = 0; i < 3; ++i)
    {
        tvec.push_back(thread(foo));
    }
    for(size_t i = 0; i < 3; ++i)
    {
        tvec[i].join();
        tvec[i] = thread(foo); // is this ok?
    }
    for(auto& t : tvec)
    {
        t.join();
    }
}

2 个答案:

答案 0 :(得分:5)

  

分配给已连接的std::thread对象应调用其析构函数

不,不应该!只有在销毁对象时才会调用析构函数,因此命名为。

  

代表合法的操作

只要线程不可连接就很好(就像你的例子中的情况一样)。否则,将调用terminate

如果您要阅读标准,而不是可疑的在线&#34;文档&#34;,您可以在[thread.thread.assign]中找到

  

效果:如果joinable(),请致电terminate()。否则,将x状态指定给*this并将x设置为默认构建状态。

答案 1 :(得分:2)

在线程上调用赋值运算符会检查线程是否为joinable(),如果是,则调用std::terminate()。如果不是,那么它将右侧的线程状态分配给分配给的线程。然后它将线程保留在默认构造状态的右侧。

这称为移动分配。实际的赋值运算符将被删除。