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

来源:互联网 发布:mac查找jdk路径 编辑:程序博客网 时间:2024/05/22 08:23
看程序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.如果传递的参数需要执行类型转换最好在传递前显示执行转换操作。
阅读全文
0 0