《C++ Concurrency in Action》笔记2 线程函数传参(1)
来源:互联网 发布:mac查找jdk路径 编辑:程序博客网 时间:2024/05/22 08:23
看程序1:
输出为:
main thread id:6080
cur thread id:13072:A::A()
sub thread id:13072
str size:0
请按任意键继续. . .
namespace mparam{ class A { public: A(const char *c) { cout << "cur thread id:" << this_thread::get_id() << ":" << "A::A()" << endl; str = c; } string str; }; void f(const A &a) { cout << "sub thread id:" << this_thread::get_id() << endl; cout << a.str << endl; cout << "str size:" << a.str.size() << endl; } void call_by_main() { cout << "main thread id:" << this_thread::get_id() << endl; char buff[256] = {0}; memset(buff, 'a', sizeof(buff)-1); thread t(f, buff); t.detach(); }}int main(){ mparam::call_by_main(); system("pause"); return 0;}
输出为:
main thread id:6080
cur thread id:13072:A::A()
sub thread id:13072
str size:0
请按任意键继续. . .
可以看出,buff并没有正确传递给子线程函数f(),而且buff转换为类A所执行的A构造函数是在子线程中执行的。
将t.detach()改为t.join()后,输出就正常了:
main thread id:11508
cur thread id:9016:A::A()
sub thread id:9016
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
str size:255
请按任意键继续. . .
main thread id:11508
cur thread id:9016:A::A()
sub thread id:9016
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
str size:255
请按任意键继续. . .
还有一种改法,如果不希望join的话,可以将thread t(f, buff)改为thread t(f, A(buff)),那么输出也是正常的,只不过buff转换为类A所执行的A构造函数是在主线程中执行的:
main thread id:2604
cur thread id:2604:A::A()
sub thread id:9424
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
str size:255
请按任意键继续. . .
main thread id:2604
cur thread id:2604:A::A()
sub thread id:9424
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
str size:255
请按任意键继续. . .
根据分析得出如下结论:
1.buff转换为类A所执行的A构造函数是在子线程中执行的。
2.buff需要拷贝到子线程,如果在拷贝结束前就销毁buff会出现未定义行为。
3.如果传递的参数需要执行类型转换最好在传递前显示执行转换操作。
1.buff转换为类A所执行的A构造函数是在子线程中执行的。
2.buff需要拷贝到子线程,如果在拷贝结束前就销毁buff会出现未定义行为。
3.如果传递的参数需要执行类型转换最好在传递前显示执行转换操作。
阅读全文
0 0
- 《C++ Concurrency in Action》笔记2 线程函数传参(1)
- 《C++ Concurrency in Action》笔记2 线程函数传参(3)类成员函数
- 《C++ Concurrency in Action》笔记2 线程函数传参(2)
- 《C++ Concurrency in Action》笔记2 线程函数传参(4)move
- 《C++ Concurrency in Action》笔记3 move线程对象
- 《C++ Concurrency in Action》笔记30 高级线程管理——线程池及中断线程
- 《C++ Concurrency In Action》part2 线程管理
- 《C++ Concurrency in Action》笔记8 死锁(2)避免死锁
- 《C++ Concurrency in Action》笔记29 设计并行代码(2)
- 《C++ Concurrency in Action》笔记1 join和detach
- 《C++ Concurrency in Action》笔记7 mutex(1)
- 《C++ Concurrency in Action》笔记8 死锁(1)
- 《C++ Concurrency in Action》笔记29 设计并行代码(1)
- C plus plus Concurrency in Action
- 读C++ concurrency in action笔记
- 《C++ concurrency in action》第二章笔记
- 《C++ Concurrency in Action》笔记 前言
- 《C++ Concurrency in Action》笔记4 hardware_concurrency()
- likely()与unlikely()
- C++运算符重载详解/ZT
- Dubbo分布式服务框架入门(附工程)
- ftp客户端的简单实现
- 资讯精选 | 无处可藏:人脸识别时代生活报告
- 《C++ Concurrency in Action》笔记2 线程函数传参(1)
- Longest Palindromic Subsequence问题及解法
- python(3)
- 计蒜客 Skiing 最长路
- 数组全排列问题
- MAVEN打包DUBBO启动器 target下lib内的jar包无法打包问题
- java对unicode的编码 和 解码
- Mybatis中#和$的区别
- [bzoj2120][bzoj2453][莫队算法]数颜色