数据副本

时间:2016-10-21 13:39:07

标签: multithreading c++11

我正在尝试使用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调用复制构造函数?

1 个答案:

答案 0 :(得分:0)

你的第一个任务&#34;将其传递到std::thread构造函数时复制一次,并在将其发送到实际工作线程时再次复制。

你的其他任务都没有被复制到任何地方 - 你所做的就是复制指向任务的任务。