代码之家  ›  专栏  ›  技术社区  ›  jonderry

如何知道使用Boost的C++中的锁需要保护哪些共享变量?

  •  2
  • jonderry  · 技术社区  · 14 年前

    例如,如果mutex无法恢复多线程访问(例如,对mutex.lock()的两个同时调用无法将事情搞砸),则多线程将无法工作。

    这是否也扩展到条件变量?具体来说,我想释放一个锁,然后调用cond.notify ou one()。理论上,另一个线程可以在通知之前获取锁,并开始自己对cond.notify ou one()的调用。有没有保证这会表现得很好?

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

    4 回复  |  直到 14 年前
        1
  •  6
  •   James McNellis    14 年前

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

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

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

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

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

    赫伯·萨特写过 a whole series of articles on Effective Concurrency 你可能会觉得有用。他讨论了各种设计模式、常见缺陷、锁层次结构和其他并发主题。

        2
  •  2
  •   Konrad Rudolph    14 年前

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

    对。只读访问可以 从未 生成多线程冲突。

        3
  •  1
  •   Bukes    14 年前

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

    具体来说,我想释放一个锁,然后调用cond.notify ou one()。理论上,另一个线程可以在通知之前获取锁,并开始自己对cond.notify ou one()的调用。有没有保证这会表现得很好?

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

    在堆上分配的简单数据结构如何?

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

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

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

        4
  •  0
  •   Halt    14 年前

    理论上,另一个线程可以在通知之前获取锁,并开始自己对cond.notify ou one()的调用。有没有保证这会表现得很好?

    通常,您会让其他线程等待条件而不是锁,但如果这样做,则获取锁的线程将阻止被条件唤醒的线程获取锁,并且发出信号的线程将不是继续的线程,而是等待锁。

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