我是靠谱客的博主 可耐荔枝,最近开发中收集的这篇文章主要介绍boost中shared_lock和unique_lock的区别使用boost::shared_mutex实现读写锁c++ - 在boost中使用作用域try_shared_lock和升级锁的示例C++并发型模式#7: 读写锁 - shared_mutex,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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("GetFieldsn");
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("SetFieldsn");
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

 

 

 

最后

以上就是可耐荔枝为你收集整理的boost中shared_lock和unique_lock的区别使用boost::shared_mutex实现读写锁c++ - 在boost中使用作用域try_shared_lock和升级锁的示例C++并发型模式#7: 读写锁 - shared_mutex的全部内容,希望文章能够帮你解决boost中shared_lock和unique_lock的区别使用boost::shared_mutex实现读写锁c++ - 在boost中使用作用域try_shared_lock和升级锁的示例C++并发型模式#7: 读写锁 - shared_mutex所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部