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

本文探讨了在C++中保护共享数据的策略,包括使用std::once_flag和std::call_once保证初始化正确性,利用读者-写者锁(如boost::shared_mutex)优化对少量更新数据的访问,以及处理嵌套锁的正确方法,避免未定义行为。这些方法旨在提升并发性能并确保数据一致性。
摘要由CSDN通过智能技术生成

如果某个想法是你唯一的想法,再也没有比这个更危险的事情了。

本节会阐述保护共享数据的替代方案,很多情况下,使用互斥量并不合适,会带来性能消耗。下文会详细讲解集中通用的场景。

保护共享数据的初始化过程

为了防止共享数据初始化时数据被破坏,C++提供了std::once_flag和std::call_once来保证共享数据初始化的正确性。

// using mutex
std::shared_ptr<some_resource> resource_ptr;
std::mutex resource_mutex;
void foo() 
{
    std::unique_lock<std::mutex> lk(resource_mutex);
    if(!resource_ptr)
    {
        resource_ptr.reset(new some_resource);
    }
    lk.unlock();
    resource_ptr->do_something();
}

// using call_once
std::shared_ptr<some_resource> resource_ptr;
std::once_flag resource_flag;

void int_resource()
{
    resource_ptr.reset(new some_resource);
}

void foo()
{
    std::call_once(resource_flag, init_resource);
    resource_ptr->do_something();
}

保护很少更新的数据量

对于这种共享数据可以采用“读者-写着锁”,其允许两种不同的使用方式:一个作者线程独占访问和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值