使用临时线程对象初始化线程是否错误,该对象可能在线程执行期间超出范围?
在下面给出的程序中,我尝试了下面给出的2种方法,并且两种方法都可以正常运行。
#include<thread>
using namespace std;
void consumer()
{
for(;;)
{}
}
int main()
{
thread t[5];
for(int i=0;i<5;i++)
{
/*
* Method 1
t[i]=std::thread(consumer);
*/
/*
* Method 2
thread local(consumer);
t[i]=std::move(local);
*/
t[i].detach();
}
while(1)
{}
return 0;
}
答案 0 :(得分:2)
两种方法都能正常工作。
更准确地说,operator=
在两种情况下都执行移动。因此,已创建线程的状态将保留在t[i]
中,并且在分配后,临时线程(情况1)或local
(情况2)都设置为默认构造的线程,该线程在结束时可能会死亡语句(情况1)或退出块(情况2)。