根据我在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();
}
}
答案 0 :(得分:5)
分配给已连接的
std::thread
对象应调用其析构函数
不,不应该!只有在销毁对象时才会调用析构函数,因此命名为。
代表合法的操作
只要线程不可连接就很好(就像你的例子中的情况一样)。否则,将调用terminate
。
如果您要阅读标准,而不是可疑的在线&#34;文档&#34;,您可以在[thread.thread.assign]中找到
效果:如果
joinable()
,请致电terminate()
。否则,将x
状态指定给*this
并将x
设置为默认构建状态。
答案 1 :(得分:2)
在线程上调用赋值运算符会检查线程是否为joinable()
,如果是,则调用std::terminate()
。如果不是,那么它将右侧的线程状态分配给分配给的线程。然后它将线程保留在默认构造状态的右侧。
这称为移动分配。实际的赋值运算符将被删除。