《C++ Concurrency in Action》笔记2 线程函数传参(1)

看程序1:
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
请按任意键继续. . .
还有一种改法,如果不希望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
请按任意键继续. . .
根据分析得出如下结论:
1.buff转换为类A所执行的A构造函数是在子线程中执行的。
2.buff需要拷贝到子线程,如果在拷贝结束前就销毁buff会出现未定义行为。
3.如果传递的参数需要执行类型转换最好在传递前显示执行转换操作。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值