std并发编程中,thread函数传参的一些陷阱

首先看如下一段代码

void myPrint(string& a)
{
    cout << a << endl;    
}

int main(void)
{
    char buffer[] = "Hello Word!";
    thread A(myPrint, buffer);
    A.detach();
    return 0;
}

上述这段代码中,会有这个问题。。
给A传入的第二个参数是一个buffer。。需要发生隐式转换,即从char[]到string。。。但这种转换有可能会在主线程执行完毕后再进行。。这会导致A线程实际
复制的参数是一段不存在的内存,会导致未定义的错误。

所以我们需要改进main函数代码
int main(void)
{
    char buffer = "Hello Word!";
    thread A(myPrint, string(buffer));    //直接在主线程中利用string的构造函数构造出临时变量
    A.detach;
    return 0;
}


上述这种方式中,就可以保证在主线程结束(即buffer内存还有效之前),A线程肯定会复制一片和buffer内容相同的内存,然后让A线程中myPrint的第二个参数
绑定到这片内存上,这样就保证了线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值