我怎么知道使用boost在c ++中锁定需要保护的共享变量?

时间:2010-10-18 17:38:46

标签: c++ multithreading boost

例如,如果互斥锁对多线程访问不具有弹性(例如,两次同时调用mutex.lock()无法解决问题),则多线程将无法工作。

这是否也扩展到条件变量?具体来说,我想释放一个锁,然后调用cond.notify_one()。从理论上讲,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。是否保证这样做会很好?

堆上分配的简单数据结构怎么样?如果只读取数据结构,是否可以允许并发访问,假设数据结构保证不会在读取时自行调整?是否存在stl数据结构和成员函数允许并发读取而不需要锁定的文档?

4 个答案:

答案 0 :(得分:6)

您需要同步访问

所在的任何对象
  1. 该对象由多个线程和
  2. 使用
  3. 这些线程中至少有一个可以修改对象。
  4. 有多种方法可以进行同步:锁(互斥)和原子可能是最常用的两种方法,尽管有一些数据结构的无锁实现。

      

    是否有关于哪些STL数据结构和成员函数允许并发读取而不需要锁定的文档?

    任何符合const的成员函数都应该可以安全地调用。

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

答案 1 :(得分:2)

  

如果只读取数据结构,是否可以允许并发访问

是。只读访问权限永远不会生成多线程冲突。

答案 2 :(得分:1)

互斥锁和条件变量是“多线程工具链”的一部分,用于实现多线程应用程序。因此,根据定义,它们是“线程安全的”。

  

具体来说,我想释放一个锁,然后调用cond.notify_one()。从理论上讲,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。是否保证这样做会很好?

在这种情况下,您需要在保持互斥锁的情况下操纵条件变量,以避免此类竞争条件。

  

堆上分配的简单数据结构怎么样?

可以同时安全地访问简单(如在字节缓冲区或C样式结构中)。任何变异对象都需要同步。

  

是否有关于哪些stl数据结构和成员函数允许并发读取而不需要锁定的文档?

据我所知,标准C ++库包通常不是线程安全的。

答案 3 :(得分:0)

  

理论上,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。是否保证这样做会很好?

你通常会让其他线程等待条件而不是锁定,但如果你这样做,那么抓住锁定的线程会阻止因抓住锁定而导致胎面被吵醒而信号线程将不会是一个继续,而不是等待锁定。

这是典型的使用模式:Boost Conditions