代码之家  ›  专栏  ›  技术社区  ›  Michael Chinen

一个线程读取另一个线程写入volatile变量-线程安全?

  •  4
  • Michael Chinen  · 技术社区  · 16 年前

    void* volatile pvoid;
    

    线程1偶尔会读取指针值以检查它是否为非null。线程1不会设置指针的值。

    我相信我不需要使用互斥或条件变量就可以脱身。
    线程1读取损坏的值或线程2写入损坏的值有什么原因吗?

    6 回复  |  直到 16 年前
        1
  •  1
  •   drawnonward    16 年前

    在值适合单个寄存器的情况下,例如内存对齐指针,这是安全的。在其他情况下,读取或写入值可能需要多条指令,读取线程可能会获取损坏的数据。如果您不确定读写是否在所有使用场景中都只接受一条指令,请使用原子读写。

        2
  •  4
  •   Community Mohan Dere    9 年前

    为了使其线程安全,您必须对变量进行原子读/写,它在所有计时情况下都是不稳定的。在Win32下有互锁函数,在Linux下可以 build it yourself with assembly

    如果你不反对GPL的话 http://www.threadingbuildingblocks.org atomic<> 模板似乎很有前途。lib是跨平台的。

        3
  •  1
  •   Logan Capaldo    16 年前

    取决于编译器、体系结构和操作系统。POSIX(因为这个问题被标记为pthreads,我假设我们不是在讨论windows或其他线程模型)和C没有给出足够的约束来回答这个问题。

        4
  •  0
  •   mbauman    16 年前

    不幸的是,您不能对纯C中的原子做任何假设。

    Chapter 5.47 of the GCC manual 更多信息。

        5
  •  0
  •   Laz    16 年前

    好吧,这看起来很好。。在这种情况下唯一的问题就是 让线程A作为检查线程,B作为修改线程。。

        6
  •  -2
  •   progrmr    16 年前