看程序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.如果传递的参数需要执行类型转换最好在传递前显示执行转换操作。