C ++ 11相当于boost shared_mutex

是否有boost::shared_mutex的C ++ 11等价物。 或者另一种解决scheme来处理在C + + 11多读者/单写作者的情况?

我试过,但没有得到shared_mutex到C ++ 11。 已经提出了未来的标准。 提案在这里 。

编辑 :修改后的版本(N3659) 被接受为C ++ 14。

这是一个实现:

http://howardhinnant.github.io/shared_mutex

http://howardhinnant.github.io/shared_mutex.cpp

简单…没有一个。 读者 – 写者locking没有标准的C ++实现。

但是,您在这里有几个选项。

  1. 你留在你自己的设备,使自己的读者 – 作家locking。
  2. 像你提到的那样,使用特定于平台的实现,如Win32 , POSIX或Boost 。
  3. 根本不要使用它 – 使用已经存在于C ++ 11中的互斥锁 。

#1一起实施你自己的是一个可怕的事业,如果你不正确的话,可以用竞争条件来解决你的代码。 有一个参考实现 ,可以使工作更容易一些。

如果你想要独立于平台的代码,或者不想在你的代码中包含任何额外的库,像读写器锁那样简单,你可以把#2从窗口中移出。

而且, #3还有一些注意事项,大多数人并没有意识到:使用读写器锁通常性能较差,并且比使用简单互斥锁的等效实现代码更难以理解。 这是因为在读写器locking实现的幕后必须进行额外的logging。


我只能向你展示你的select,真的是由你来衡量每一个的成本和收益,并select最好的。


编辑: C ++ 17现在有一个shared_mutextypes的情况下,有多个并发读者的好处超过了shared_mutex本身的性能成本。

不,在C ++ 11中没有boost::shared_mutex等价物。

读/写locking在C ++ 14或更高版本中受支持,但是:

  • C ++ 14添加了std::shared_timed_mutex
  • C ++ 17添加了std::shared_mutex

不同之处在于std::shared_timed_mutex增加了额外的定时操作。 它实现了SharedTimedMutex概念 ,它是由std::shared_mutex实现的更简单的TimedMutex概念的扩展。


请记住,获取读取/写入互斥锁的成本要比获取正常的std::mutex成本高。 因此,如果您有频繁但短暂的读取操作,读/写互斥将不会提高性能。 它更适合于读取操作频繁且昂贵的场景。 引用Anthony Williams的文章 :

locking一个shared_mutex的成本要高于locking一个普通的std :: mutex,即使是读者线程。 这是function的一个必要部分—有一个shared_mutex比mutex更可能的状态,并且代码必须正确处理它们。 这个成本来自于对象的大小(在你的实现和我的POSIX实现中都包含一个普通的互斥量和一个条件variables)以及locking和解锁操作的性能。

此外,shared_mutex是争用点,因此不可扩展。 lockingshared_mutex必然会修改互斥锁的状态,即使是读locking也是如此。 因此,保持shared_mutex状态的高速caching行必须被传送到执行locking或解锁操作的任何处理器。

如果你有很multithreading执行频繁的,短的读操作,那么在多处理器系统上,这可能导致大量的caching乒乓,这将对系统的性能产生很大的影响。 在这种情况下,你可能会采用简单的简单的互斥体devise,因为读者本质上是序列化的。

如果读取不频繁,那么就没有争用,所以你不需要担心并发读者,无论如何,一个普通的互斥体就足够了。

如果读取操作耗时,那么这个争用的结果是不太明显的,因为它与持有读锁的时间相比是相形见绌的。 然而,在拿着锁的同时进行耗时的操作是一种devise气味。

在绝大多数情况下,我认为shared_mutex有更好的select。 这些可能是一个普通的互斥体,shared_ptr的primefaces支持,使用精心构造的并发容器,或其他,取决于上下文。