在C中,我有一个声明为volatile且初始化为null的指针。
void* volatile pvoid;
线程1偶尔会读取指针值以检查它是否是非空的。线程%1不会设置指针的值。线程2将只设置指针的值一次。
我相信我可以不使用互斥或条件变量。
线程1将读取损坏的值或线程2将写入损坏的值是否有任何原因?
发布于 2010-06-20 02:12:04
在值适合单个寄存器的情况下,例如内存对齐指针,这是安全的。在其他可能需要多条指令来读取或写入值的情况下,读取线程可能会得到损坏的数据。如果您不确定读写是否在所有使用场景中都采用单个指令,请使用原子读写。
发布于 2010-06-20 02:19:17
为了使其线程安全,您必须对变量进行原子读/写,它的易失性并不是在所有计时情况下都是安全的。在Win32下有互锁函数,如果你不想使用重量级互斥锁和条件变量,你可以使用build it yourself with assembly。
如果你不反对GPL,那么http://www.threadingbuildingblocks.org和它的atomic<>
模板似乎很有前途。库是跨平台的。
发布于 2010-06-20 02:40:21
取决于您的编译器、体系结构和操作系统。POSIX (因为这个问题被标记为pthread,我假设我们不是在讨论windows或其他一些线程模型)和C没有给出足够的约束来对这个问题有一个可移植的答案。
当然,安全的假设是用互斥锁保护对指针的访问。然而,根据您对问题的描述,我想知道pthread_once是不是一个更好的方法。当然,问题中没有足够的信息来说明这一点或另一点。
https://stackoverflow.com/questions/3076637
复制相似问题