Amn*_*non 12 c++ multithreading boost mutex
我正在尝试在多线程场景中实现以下代码:
Get shared access to mutex
Read data structure
If necessary:
Get exclusive access to mutex
Update data structure
Release exclusive lock
Release shared lock
Run Code Online (Sandbox Code Playgroud)
Boost线程有一个shared_mutex专为多读者单作者模型设计的类.关于这个类,有几个stackoverflow问题.但是,我不确定它适合任何读者可能成为作家的情况.文件说明:
UpgradeLockable概念是SharedLockable概念的改进,允许可升级的所有权以及共享所有权和独占所有权.这是SharedLockable概念提供的多读取器/单写模型的扩展:单个 线程可以在其他人拥有共享所有权的同时具有可升级的所有权.
从单词"single"我怀疑只有一个线程可以持有可升级的锁.其他人只持有共享锁,无法升级到独占锁.
你知道boost::shared_lock在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?
Ste*_*end 15
是的,你可以做你想要什么,如图接受的答案在这里.升级到独占访问权限的呼叫将阻止,直到所有读者完成.
boost::shared_mutex _access;
void reader()
{
// get shared access
boost::shared_lock<boost::shared_mutex> lock(_access);
// now we have shared access
}
void writer()
{
// get upgradable access
boost::upgrade_lock<boost::shared_mutex> lock(_access);
// get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
// now we have exclusive access
}
Run Code Online (Sandbox Code Playgroud)
boost::shared_lock在这种情况下没有帮助(可以成为编写者的多个读者),因为只有一个线程可能拥有可升级的锁.这可以通过问题中的文档引用以及查看代码(thread\win32\shared_mutex.hpp)来暗示.如果一个线程试图获得一个可升级的锁,而另一个线程持有一个,它将等待另一个线程.
我决定对所有读者/作者使用常规锁,这在我的情况下是可以的,因为关键部分很短.