C++ 在boost中使用作用域try_共享_锁和升级锁的示例

C++ 在boost中使用作用域try_共享_锁和升级锁的示例,c++,boost,C++,Boost,我有一个线程池,它使用boost库中的共享互斥体 虽然我的另一个问题的答案很有帮助, 我意识到,如果无法获得共享锁或升级锁,我实际上需要的不是阻止。不幸的是,boost文档缺少任何正在使用的示例 请有人给我指出或提供一个具体的例子,说明以这种方式使用的共享_锁 i、 e 答案似乎是您可以提供增强功能:尝试将_to _lock作为几个作用域锁的参数 e、 g boost::共享互斥体互斥体; //读者版 boost::共享锁(互斥锁,boost::try-to-lock); 如果(锁定){ //

我有一个线程池,它使用boost库中的共享互斥体

虽然我的另一个问题的答案很有帮助,

我意识到,如果无法获得共享锁或升级锁,我实际上需要的不是阻止。不幸的是,boost文档缺少任何正在使用的示例

请有人给我指出或提供一个具体的例子,说明以这种方式使用的共享_锁

i、 e


答案似乎是您可以提供增强功能:尝试将_to _lock作为几个作用域锁的参数

e、 g

boost::共享互斥体互斥体;
//读者版
boost::共享锁(互斥锁,boost::try-to-lock);
如果(锁定){
//我们获得了一个共享锁
}
//作者版本
boost::升级锁写入锁(互斥锁,boost::尝试锁定);
如果(写入锁定){
boost::将_升级为_unique _lockunique _lock(写入_lock);
//现在已获得独占访问权限。
}
编辑: 我还通过实验发现,如果没有升级锁,升级到唯一锁将失败。您也可以这样做:

boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(write_lock);
if (unique_lock){
  // we are the only thread in here... safe to do stuff to our shared resource
}

// If you need to downgrade then you can also call
unique_lock.release();

// And if you want to release the upgrade lock as well (since only one thread can have upgraded status at a time)
write_lock.unlock().
boost::升级到唯一锁唯一锁(写锁);
if(唯一锁定){
//我们是这里唯一的线索…可以安全地利用我们的共享资源
}
//如果你需要降级,你也可以打电话
唯一的_lock.release();
//如果您还想释放升级锁(因为一次只能有一个线程具有升级状态)
写入_lock.unlock()。
注意:您必须先调用release,然后再调用unlock,否则会引发锁定异常。 当然,您可以让unique_lock和write_lock超出范围,从而释放锁,尽管我发现有时您希望更早地释放它,并且应该在该状态下花费最少的时间

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.
}
boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(write_lock);
if (unique_lock){
  // we are the only thread in here... safe to do stuff to our shared resource
}

// If you need to downgrade then you can also call
unique_lock.release();

// And if you want to release the upgrade lock as well (since only one thread can have upgraded status at a time)
write_lock.unlock().