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

Is it ok to replace std::thread objects?

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

assigning to a joined std::thread object should call its destructor

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

and represents a legitimate operation

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

如果你要阅读标准,而不是在线阅读可疑的 "documentation",你会在 [thread.thread.assign]

中找到

Effects: If joinable(), calls terminate(). Otherwise, assigns the state of x to *this and sets x to a default constructed state.

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

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