C++17 引入了std::shared_mutex
和std::scoped_lock
. scoped_lock
我现在的问题是,当它作为参数传递时,它似乎总是将共享互斥锁锁定在独占(写入器)模式,而不是在共享(读取器)模式下。在我的应用程序中,我需要dst
使用来自 object 的数据更新 object src
。我想锁定src
共享和dst
独占。src
不幸的是,如果同时使用和dst
切换调用另一个更新方法,这有可能导致死锁。所以我想使用std::scoped_lock
.
我可以scoped_lock
同时锁定src
和dst
独占模式,但是这种不必要的严格锁定会在其他地方产生性能回退。但是,似乎可以将src
's包装shared_mutex
成 astd::shared_lock
并将其与 : 一起使用scoped_lock
:当scoped_lock
在其锁定操作期间调用try_lock()
时shared_lock
,后者实际上会调用try_shared_lock()
' src
s shared_mutex
,这就是我所需要的。
所以我的代码看起来很简单:
struct data {
mutable std::shared_mutex mutex;
// actual data follows
};
void update(const data& src, data& dst)
{
std::shared_lock slock(src.mutex, std::defer_lock);
std::scoped_lock lockall(slock, dst.mutex);
// now can safely update dst with src???
}
在另一个(避免死锁)锁卫中使用这样的(共享)锁卫是否安全?