boost互斥锁_boost mutex以及scoped_lock应用

boost::mutex提供了跨平台的锁操作,不允许多个线程同时访问共享资源,从而确保共享资源不被脏写。在本文中仅仅是介绍简单的两种锁,最高效的锁boost::mutex和区域锁boost::mutex::scoped_lock

boost::mutex例子

#include

boost::mutex m_mutexAccessServiceManager;

void CSettingCenter::ClearPlatformServiceInfoCache()

{

m_mutexAccessServiceManager.lock();

m_mapAccessServiceManager.clear();

m_mutexAccessServiceManager.unlock();

}

区域锁boost::mutex::scoped_lock顾名思义就是在作用域内有效,当离开作用域自动释放锁,传递参数是锁。区域锁就是把锁封装到一个对象里面。锁的初始化放到构造函数,锁的释放放到析构函数。这样当锁离开作用域时,

析构函数会自动释放锁。即使运行时抛出异常,由于析构函数仍然会自动运行,所以锁仍然能自动释放。一个典型的区域锁

void test()

{

boost::mutex::scoped_lock lock(m_mutexAccessServiceManager);

m_mapAccessServiceManager.clear();

}

应用于有大量的return返回的代码,避免出现死锁的问题

扩展

std::scoped_lock提供了可变参数长度的构造器,接收多个锁。允许在可能导致死锁的状态下,对多个互斥量加锁。例如:

{

// safely locked as if using std::lock

std::scoped_lock<:mutex std::mutex> lock(mutex1, mutex2);

}

目前std::lock_guard已经被废弃,GCC7已经完整支持

friend void swap(X& lhs, X& rhs)

{

if (&lhs == & rhs)

return;

std::lock(lhs.m, rhs.m);

std::lock_guard<:mutex> lock_a(lhs.m, std::adopt_lock);

std::lock_guard<:mutex> lock_b(rhs.m, std::adopt_lock);

swap(lhs.some_detail, rhs.some_detail);

}

friend void swap(X& lhs, X& rhs)

{

if (&lhs == &rhs)

return;

std::scoped_lock guard(lhs.m, rhs.m);

swap(lhs.some_detail, rhs.some_detail);

}

引用

https://stackoverflow.com/questions/43019598/stdlock-guard-or-stdscoped-lock

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值