有两个线程(t1和t2)固定到两个不同的内核。它们都有一个共享变量,它是指向某个类类型的原始指针。 t1只读指针,t2读/写指针。我应该将指针声明为volatile或atomic还是两者兼而有之?
当t2更新这个指针时,如果t1读取旧指针或新指针就没问题,但它不应该读取任何中间值,因为它会导致seg错误。
答案 0 :(得分:6)
volatile
对于告诉编译器不要优化对变量使用的内存的重复访问非常有用。如果另一个线程可以更新变量,显然你会想要这个。它被称为“几乎无用”的原因是,在很多情况下,这不足以保证正确的多线程行为,并且您需要查看内存栅栏和原子基元操作。
在某些处理器体系结构(如Intel)上,只要对内存进行正确对齐,对整数或指针的读取或写入就是原子的。例如,请参阅http://software.intel.com/en-us/forums/showpost.php?p=31711英特尔链接不断更改,因此无法找到最终资源。
答案 1 :(得分:3)
volatile
对多线程无用,因此该选项已用完。你确实只想要一个原子变量。