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

我需要一个互斥来阅读吗?

  •  38
  • Tom  · 技术社区  · 16 年前

    6 回复  |  直到 16 年前
        1
  •  24
  •   Stack Overflow is garbage    16 年前

    视情况而定。

    C++语言不涉及线程或原子性。

    但关于 最 在现代CPU中,读取整数是一个原子操作,这意味着您将始终读取一致的值,即使没有互斥。

    然而 ,没有互斥锁或其他形式的同步,编译器和CPU可以自由地对读写进行重新排序,因此任何更复杂的事情,任何涉及访问多个变量的事情,在一般情况下都是不安全的。

    假设writer线程更新了一些数据,然后设置了一个整数标志来通知其他线程数据可用,那么可以对其重新排序,以便设置该标志 更新数据。除非您使用互斥或其他形式的内存屏障。

    做

        2
  •  10
  •   Ernelli    16 年前

    你有两个线程,它们交换信息,是的,你需要一个互斥,你可能还需要一个有条件的等待。

    线程用于提高性能(或提高响应能力),轮询通常会导致性能下降,这可能是由于占用大量CPU或由于轮询间隔而引入延迟。

        3
  •  2
  •   Jeff Ober    16 年前

    对如果线程a在线程b写入变量时读取变量,则可以读取未定义的值。读写操作不是原子操作,尤其是在多处理器系统上。

        4
  •  2
  •   EFraim    16 年前

    一般来说,如果变量是用“volatile”声明的,则不会。而且只有当它是一个单一的变量时——否则你应该对可能的种族非常小心。

        5
  •  2
  •   geva30    16 年前

    实际上,没有理由为读取而锁定对对象的访问。您只想在写入时锁定它。这正是读写器锁的含义。只要没有写操作,它就不会锁定对象。它可以提高性能并防止死锁。有关详细说明,请参见以下链接:

    wikipedia codeproject

        6
  •  0
  •   aJ.    16 年前

    应保护对枚举的访问(读或写)。

    还有一件事: 如果线程争用较少,并且线程属于同一进程,则临界区将优于互斥区。