boost中shared_lock和unique_lock的区别

https://blog.csdn.net/business122/article/details/80882199

 

简单的说:

shared_lock是read lock。被锁后仍允许其他线程执行同样被shared_lock的代码。这是一般做读操作时的需要。

unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。在写操作时,一般用这个,可以同时限制unique_lock的写和share_lock的读。

 

例子:

 

void GetFields(DBFields& _return, const std::wstring& sGUID) 
{
    printf("GetFields\n");
boost::shared_lock< boost::shared_mutex > xLock( GetMutex(sGUID) ); //用shared_lock, 其他线程不可以执行下面的SetFields(), 但可以同时执行GetFields()
_return = GetDataPtr(sGUID)->m_oFieldData.m_oDBFields;
  }


void SetFields(const std::wstring& sGUID, const DBFields& aFields)
{    
    printf("SetFields\n");
boost::unique_lock< boost::shared_mutex > xLock(  GetMutex(sGUID) ); //用unique_lock, 其他线程一定要等到这个函数结束才可以执行SetFields()或GetFields()。
GetSetDataPtr(sGUID)->m_oFieldData.m_oDBFields = aFields;
  }

 

使用boost::shared_mutex实现读写锁

https://blog.csdn.net/AC_hell/article/details/72629246?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

 

伟大的Boost库给我们提供了 shared_mutex  类,结合 unique_lock 与 shared_lock 的使用,可以实现读写锁。

 

通常读写锁需要完成以下功能:

1.当 data 被线程A读取时,其他线程仍可以进行读取却不能写入

2.当 data 被线程A写入时,其他线程既不能读取也不能写入

 

对应于功能1,2我们可以这样来描述:

1.当线程A获得共享锁时,其他线程仍可以获得共享锁但不能获得独占锁

2.当线程A获得独占锁时,其他线程既不能获得共享锁也不能获得独占锁

typedef boost::shared_lock<boost::shared_mutex> read_lock;
typedef boost::unique_lock<boost::shared_mutex> write_lock;
 
boost::shared_mutex read_write_mutex;
int32_t data = 1;
 
//线程A,读data
{
	read_lock rlock(read_write_mutex);
	std::cout << data << std:; endl;
}
 
//线程B,读data
{
	read_lock rlock(read_write_mutex);
	std::cout << data << std:; endl;
}
 
//线程C,写data
{
	write_lock rlock(read_write_mutex);
	data = 2;
}


通过 shared_lock 为 shared_mutex 上锁之后,线程将获得其共享锁,此时其他线程仍可以获得共享锁来读取 data,但是此时 unique_lock 将无法为 shared_mutex 上独占锁,功能1实现了。通过 unique_lock 为 shared_lock 上锁之后,线程将获得独占锁,此时无法再被上锁,功能2页实现了。

c++ - 在boost中使用作用域try_shared_lock和升级锁的示例

https://www.coder.work/article/1702344

https://stackoverflow.com/questions/3963771/example-of-using-scoped-try-shared-lock-and-upgrade-lock-in-boost

boost::shared_mutex mutex;

// The reader version
boost::shared_lock<boost::shared_mutex> lock(mutex, boost::try_to_lock);
if (lock){
  // We have obtained a shared lock
}

// Writer version
boost::upgrade_lock<boost::shared_mutex> write_lock(mutex, boost::try_to_lock);
if (write_lock){
  boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(write_lock);
  // exclusive access now obtained.
}

C++并发型模式#7: 读写锁 - shared_mutex

http://dengzuoheng.github.io/cpp-concurency-pattern-7-rwlock

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值