c++多线程入门(2)

本文介绍了C++多线程入门的一些关键概念,包括如何向线程函数传递参数,避免悬空引用问题,以及如何通过unique_ptr实现动态参数传递。此外,还探讨了线程归属权的转移,如使用move操作和实现类似C++20 jthread的joining_thread类。最后,提供了一个并行版的accumulate函数实战示例。
摘要由CSDN通过智能技术生成

一: 向线程函数传递参数

thread的构造函数里第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数

//若用cout<< *** <<endl输出可能会乱序
void func(int i,string s)
{
    printf("i=%d,s=%s",i,s.c_str());
}
int main()
{
    int i=1;
    char s[]="test";

    //第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数
    thread t1(func,i,s);
    t1.detach();
}

----------------------------

线程内部有存储空间, 参数会按照默认方式复制到该处, 新创建的线程才能直接访问他们

上面的代码数组s以char const*的形式传入, 进入线程的上下文环境以后, 才转换为string类型

但有问题:

        可能没转换之前, 主线程已经退出,并销毁s, 造成子线程对s的悬空引用

一个解决办法如下: 加上string(s)保证在传进参数之前已经转化为string对象

//若用cout<< *** <<endl输出可能会乱序
void func(int i,const string &s)
{
    printf("i=%d,s=%s",i,s.c_str());
}
int main()
{
    int i=1;
    char s[]="test";

    //第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数
    //加上string(s)保证在传进参数之前已经转化为string对象
    thread t1(func,i,string(s));
    t1.detach();
}

-----------------------

考虑另一种情形, 参数需要非const引用, 而不复制对象, 以下代码编译失败

void func(int &i)
{
    printf("i=%d");
}
int main()
{
    int i=1;
    //编译失败
    thread t1(func,i);
    t1.join();
}

原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值