我正在尝试使用gcc HEAD 7.0.0 20161020和c + 1z(GNU)的简单线程程序
非常简单的程序,
#include <thread>
#include <iostream>
class Task
{
public:
Task(int i):_i(i){}
Task(const Task& p):_i(p._i){std::cout<<"Copy called:"<<_i<<std::endl;}
void operator()(){std::cout<<"operator()"<<_i<<std::endl;}
void runTask(void* p)
{
if (p) {}
std::cout<<"runTask():"<<_i<<std::endl;
}
private:
int _i;
};
int main()
{
std::cout<<"Begin main()"<<std::endl;
Task tsk1(11);
Task tsk2(22);
Task tsk3(33);
std::cout<<"Create threads"<<std::endl;
std::thread t1 {tsk1};
std::thread t2(&Task::runTask, &tsk2, nullptr);
std::thread t3(&Task::runTask, &tsk3, nullptr);
t1.join();
t2.join();
t3.join();
std::cout<<"End main()"<<std::endl;
return 0;
}
其中输出为: -
Begin main()
Create threads
Copy called:11
Copy called:11
operator()11
runTask():22
runTask():33
End main()
0
任何人都可以建议为什么线程t1的复制构造函数被调用两次而不是按预期调用一次?另外,为什么没有为线程t2和t3调用复制构造函数?
答案 0 :(得分:0)
你的第一个任务&#34;将其传递到std::thread
构造函数时复制一次,并在将其发送到实际工作线程时再次复制。
你的其他任务都没有被复制到任何地方 - 你所做的就是复制指向任务的任务。