关于c++11多线程thread类对象作为参数传递,拷贝构造次数问题

thread在使用类对象作为参数传递过程中,常常会出现多次拷贝构造的情况,理想中的情况是只需一次拷贝构造。原因是由于不同编译器对thread函数处理是不同的。

测试代码

#include <iostream>
#include <unistd.h>
#include <thread>
using namespace  std;


/**
 * 用类对象创建线程
 */
class SonTheardClass{
public:
    SonTheardClass(int i):num(i)
    {
        cout <<"构造函数被执行,线程ID:"<<this_thread::get_id()<<endl;
    }
    SonTheardClass(const SonTheardClass &mysonthread):num(mysonthread.num)
    {
        cout<<"拷贝构造被执行,线程ID:"<<this_thread::get_id()<<endl;
    }
    void operator() ()//不能带参数
    {
        cout<<"mySonTheardClass is begining!"<<endl;
        cout<<"作为类参数对象被执行,线程ID:"<<this_thread::get_id()<<endl;
        cout<<"mySonTheardClass is over!"<<endl;
    }
    ~SonTheardClass(){
        cout<<"析构被执行,线程ID"<<this_thread::get_id()<<endl;
    }
public:
    int num;
};

int main(int argc, char *argv[])
{

    cout << "主线程:开始"<<endl;//主线程是从main函数开始执行,执行到return ,主线程结束
    SonTheardClass mySonTheardClass(6);

    thread thread1(mySonTheardClass);//创建线程,线程起点是mySonThread

   thread1.join();//主线程执行到这里开始阻塞,等待mySonThread执行完,主线程继续往下执行

    cout<<"主线程:结束"<<endl;

    return 0;
}

测试结果

linux 下GCC编译器测试结果:

在这里插入图片描述 对象被拷贝构造了两次后,被析构掉一次,将第一次拷贝构造的对象传入子线程。

Windows下VS2015测试结果

在这里插入图片描述
可以看到,在VS2015平台上,对象仅被拷贝构造一次就被送入到子进程中。

Windows下 VS2013测试结果

在这里插入图片描述
可以看到在VS2013平台上,对象被拷贝构造了三次,而且被传入到子进程中还要进行一次拷贝构造。

结论

因此可以看出不同的编译器或平台,对于thread函数处理的方式是不一样

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值