是否可以替换std::thread对象

Is it ok to replace std::thread objects?

本文关键字:thread 对象 std 替换 是否      更新时间:2023-10-16

根据我在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();
    }
}

赋值给一个连接的std::thread对象应该调用它的析构函数

不,它不应该!析构函数仅在对象被析构时调用,因此得名。

,表示合法操作

只要线程不可连接(如您的示例中的情况)就可以。否则将调用terminate

如果您要阅读标准,而不是可疑的在线"文档",您可以在[thread.thread.assign]

中找到。

效果:如果是joinable(),则呼叫terminate()。否则,将x的状态赋值给*this,并将x设置为默认构造状态。

在线程上调用赋值操作符检查该线程是否为joinable(),如果是,则调用std::terminate()。如果不是,那么它将右边线程的状态分配给被分配的线程。然后让右边的线程保持默认的构造状态。

这被称为move赋值。实际的赋值操作符被删除。