c++ - 我如何知道我需要使用 boost 在 C++ 中使用锁来保护哪些共享变量?

标签 c++ multithreading boost

例如,如果互斥体对多线程访问没有弹性(例如,同时调用 mutex.lock() 不能搞砸),多线程将永远无法工作。

这是否也适用于条件变量?具体来说,我想释放一个锁,然后调用 cond.notify_one()。理论上,另一个线程可以在通知之前获取锁并开始它自己对 cond.notify_one() 的调用。是否可以保证这会表现良好?

分配在堆上的简单数据结构呢?如果数据结构只被读取,允许并发访问是否可以,假设数据结构保证不会在读取时 self 调整?是否有关于哪些 STL 数据结构和成员函数允许并发读取而不需要锁定的文档?

最佳答案

您需要同步对任何对象的访问

  1. 该对象被多个线程使用并且
  2. 这些线程中至少有一个可以修改该对象。

有多种方法可以实现这种同步:锁(互斥锁)和原子可能是最常用的两种,尽管某些数据结构有无锁实现。

Is there documentation on which STL data structures, and member functions allow concurrent reads without requiring locking?

任何 const 限定的成员函数都应该可以安全调用。

Herb Sutter 写过 a whole series of articles on Effective Concurrency您可能会发现它很有用。他讨论了各种设计模式、常见陷阱、锁层次结构和其他并发主题。

关于c++ - 我如何知道我需要使用 boost 在 C++ 中使用锁来保护哪些共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961752/

相关文章:

c# - 如何告诉调试器不要停止一些关键线程?

c++ - 使用 boost bind 时对非静态成员函数的使用无效 - C++

c++ - 有没有办法在c++中检测中文字符? (使用 boost )

c++ - FFT 窗口导致频谱放大不均

c++ - 有效地计算像素到它们对应的对极线的距离

Python 2.6 与 2.7 多线程性能问题 (futex)

c# - 使用 Task.Factory.StartNew 和 Thread.Sleep 等待 x 秒

c++ - boost.serialization 并替换现有的序列化 std::wstring 的方法

c++ - C++ 中的函数类似于 numpy flatten

c++ - QWebkit 显示本地网页