是否可以替换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();
}
}
赋值给一个连接的
std::thread
对象应该调用它的析构函数
不,它不应该!析构函数仅在对象被析构时调用,因此得名。
,表示合法操作
只要线程不可连接(如您的示例中的情况)就可以。否则将调用terminate
。
如果您要阅读标准,而不是可疑的在线"文档",您可以在[thread.thread.assign]
中找到。效果:如果是
joinable()
,则呼叫terminate()
。否则,将x
的状态赋值给*this
,并将x
设置为默认构造状态。
在线程上调用赋值操作符检查该线程是否为joinable()
,如果是,则调用std::terminate()
。如果不是,那么它将右边线程的状态分配给被分配的线程。然后让右边的线程保持默认的构造状态。
这被称为move赋值。实际的赋值操作符被删除。
相关文章:
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 在没有复制构造函数的对象的成员函数中启动 std::thread
- 如何在 UWP C++/CX 中对象的成员函数中使用 std::thread
- 线程在销毁包含该线程的对象时调用 thread.detach()
- 移动包含正在运行的 std::thread 成员的对象
- 将回调函数中对对象的引用传递给 std::thread
- 扩展 std::thread 的 ref 对象的传递范围
- 从具有本地 std::thread 对象而不连接的函数退出
- 构造std::thread对象过程中的详细信息
- 使用C++0x std::thread调用新ed对象中的成员函数
- 访问可调用对象 一个 boost::thread 是用来构造的
- 从另一个 std::thread 调用 Qt 对象方法
- 通过引用C++11中的std::thread来传递对象
- 为什么我不能使用 std::thread 通过引用发送对象
- Std::thread在对象中派生的线程,它何时终止?
- 可以从同一个线程中移动assign std::thread对象吗?
- 在超时后销毁thread和deadline_timer对象
- 使用 boost::thread 将 c++ 对象从一个线程传递到另一个线程的正确方法是什么?
- 是否可以替换std::thread对象