/*
基本类型传值
*/
#include <iostream>
#include <thread> void func(int num)
{
num = ;
std::cout << "func: " << num << std::endl;
} int main()
{
int num = ;
std::thread my_job(func, num);
my_job.join(); std::cout << "main: " << num << std::endl;
return ;
}
/*
基本类型传引用
*/
#include <iostream>
#include <thread> void func(int &num)
{
num = ;
std::cout << "func: " << num << std::endl;
} int main()
{
int num = ;
std::thread my_job(func, std::ref(num));
my_job.join(); std::cout << "main: " << num << std::endl;
return ;
}
/*
类类型传值
*/
#include <iostream>
#include <thread> class A
{
public:
int num_;
A(int num) : num_(num)
{
std::cout << "A(int num)" << std::endl;
}
A(const A &a) : num_(a.num_)
{
std::cout << "A(const A &a)" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
}; void func(A a)
{
std::cout << "a.num_ = " << a.num_ << std::endl;
a.num_ = ;
} int main()
{
A a();
std::thread my_job(func, a);
my_job.join(); std::cout << "main : a.num_ = " << a.num_ << std::endl;
return ;
}

类类型传值执行结果:多次调用拷贝构造函数,影响效率,所以不推荐这种做法

/*
类类型传引用
*/
#include <iostream>
#include <thread> class A
{
public:
int num_;
A(int num) : num_(num)
{
std::cout << "A(int num)" << std::endl;
}
A(const A &a) : num_(a.num_)
{
std::cout << "A(const A &a)" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
}; void func(A &a)
{
std::cout << "a.num_ = " << a.num_ << std::endl;
a.num_ = ;
} int main()
{
A a();
std::thread my_job(func, std::ref(a));
my_job.join(); std::cout << "main : a.num_ = " << a.num_ << std::endl;
return ;
}

如果希望子线程里面不修改对象的内容,形参可加const修饰。

/*
传智能指针
*/
#include <iostream>
#include <thread> void func(std::unique_ptr<int> int_ptr)
{
std::cout << *int_ptr << std::endl;
} int main()
{
std::unique_ptr<int> int_ptr(new int()); std::thread my_job(func, std::move(int_ptr));
my_job.join(); return ;
}

C++11并发编程3------线程传参的更多相关文章

  1. c++11中关于`std::thread`线程传参的思考

    关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...

  2. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  3. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. C++11 并发编程库

    C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...

随机推荐

  1. 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:使用TensorFlow和Keras开发高级自然语言处理系统——LSTM网络原理以及使用LSTM实现人机问答系统

    !mkdir '/content/gdrive/My Drive/conversation' ''' 将文本句子分解成单词,并构建词库 ''' path = '/content/gdrive/My D ...

  2. 吴裕雄 python 机器学习——模型选择验证曲线validation_curve模型

    import numpy as np import matplotlib.pyplot as plt from sklearn.svm import LinearSVC from sklearn.da ...

  3. 学习笔记(23)- plato-准备中文语料

    以plato使用的metalwoz数据集的INSURANCE为例,进行语料的汉化过程. 1. 下载数据集 微软的数据集,下载地址:https://www.microsoft.com/en-us/res ...

  4. Numpy Pandas

    数据分析 : 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律. 数据分析三剑客 -  Numpy Pandas Matplotlib # Numpy 基于一维或多维的数 ...

  5. gitlab的搭建与汉化

    gitlab的搭建:内存最好2G以上 yum -y install curl unzip policycoreutils git wget         安装相关依赖包 所有gitlab rpm包的 ...

  6. ELK日志分析系统部署

    ======================================================================================= 操作系统 IP地址 主机 ...

  7. MySQL主从复制(一主两从)

       主库开启bin-log二进制日志功能,并建立slave账号,并授权从库连接主库,从库通过change master得到主库的相关同步信息, 然后连接主库进行验证,主库产生的新数据会导入到bin- ...

  8. SQL 层级数据查询出树形状态

    WITH TEST AS (SELECT  DEPTID,PARENTDEPT,SORTORDER,1 SPAC,CONVERT(CHAR(200),RTRIM(DEPTID)+CONVERT(CHA ...

  9. 「CQOI2015」任务查询系统

    「CQOI2015」任务查询系统 传送门 好像也是板子题??? 区间修改,单点查询,考虑差分. 然后每次查询时就直接在对应的主席树上二分即可. 参考代码: #include <cstdio> ...

  10. ROM, RAM, NVRAM and Flash Memory on Cisco Routers

    当谈到路由器有多少内存以及哪些内存做什么时,有时人们会感到困惑. 您应该熟悉4个内存术语,在升级路由器的IOS之前应检查其中2个. 这些是以下内容: ROM:ROM代表只读存储器. 它存储System ...