我正在用 C++ 编写一个 CPU 密集型程序,它有多个线程需要访问共享数据结构,因此需要锁定。为了最大限度地提高吞吐量,我想将瓶颈保持在最低限度。看起来十有八九只需要读取数据结构,十有八九需要修改它。
有没有办法让线程获取读或写锁,这样写锁会阻塞一切,但读锁不会互相阻塞?
一个可移植的解决方案将是理想的,但如果有一个适用于 Windows 的解决方案和另一个适用于 Linux 的解决方案,那就没问题了。
我正在用 C++ 编写一个 CPU 密集型程序,它有多个线程需要访问共享数据结构,因此需要锁定。为了最大限度地提高吞吐量,我想将瓶颈保持在最低限度。看起来十有八九只需要读取数据结构,十有八九需要修改它。
有没有办法让线程获取读或写锁,这样写锁会阻塞一切,但读锁不会互相阻塞?
一个可移植的解决方案将是理想的,但如果有一个适用于 Windows 的解决方案和另一个适用于 Linux 的解决方案,那就没问题了。
是的,这是可以通过读写锁解决的常见情况。
请注意,根据程序的动态属性,您可能需要小心writer starvation。如果有足够多的读者,他们的阅读尝试总是重叠(或重叠很长时间),那么一个简单的读写器锁实现将通过让写者等待直到没有读者阅读而“饿死”写者。在更高级的实现中,从概念上讲,写入器请求将在后续读取器之前插入队列中,从而允许写入器在所有先前活动的读取器完成后有机会访问。
大多数实现都要求您提前知道您想要读锁还是写锁。一些实现允许您将读锁“升级”为写锁,而不必先释放读锁(这将使另一个写入者有机会进入锁)。