【C++ 并发与多线程】std::thread类-为共享数据加锁 1

本文讨论了在C++并发编程中如何正确使用std::thread和互斥量来保护共享数据。指出不要将保护数据暴露在互斥锁作用域外,以及谨慎设计数据接口以避免条件竞争。示例代码展示了错误做法可能导致的未定义行为和非预期结果,建议重新设计接口以提供线程安全的代码。
摘要由CSDN通过智能技术生成

让复用变得容易,拒绝重复。

 上一节说到,std::mutex并不能完全解决保护数据的问题。存在好几种情况,即使我们已经使用了互斥量,数据还是被破坏了。

  • 将被保护数据暴露到互斥量作用域之外
  • 被保护数据的访问接口本身就存在竞态条件(条件竞争)

 不要暴露你的数据

来看下面例子:

struct protected_data
{
    char data[100];
}
class MutexTest
{
public:
    template<typename Function>
    void process(Function func)
    {
        std::lock_guard<std::mutex> guard<m_dataMutex>;     
        func(m_data); 
    }
private:
    std::mutex            m_dataMutex;
    struct protected_data m_data;   
}
struct protected_data *pData; 
void inject(Data &data)
{
    pData = &data;
}
// 即使process没有显式传出,但是还是被inject传出
// process执行完后,pData能在无锁的情况下访问数据
void Test()
{
    process(inject);
    for(int i = 0; i < 100; ++i)
    {
        pData.data[i] = i;
    }
}
std::thread mutexTestThread1(Test);
std:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值