6

有两个线程(t1 和 t2)固定到两个不同的内核。它们都有一个共享变量,它是指向某些类类型的原始指针。t1 只读取指针,t2 读取/写入指针。我应该将指针声明为 volatile 或 atomic 还是两者兼而有之?

当 t2 更新这个指针时,如果 t1 读取旧指针或新指针都可以,但它不应该读取任何中间值,因为它会导致 seg 错误。

4

2 回答 2

6

volatile对于告诉编译器不要优化对变量使用的内存的重复访问很有用。显然,如果另一个线程可能正在更新变量,你会想要这个。它被称为“几乎没用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存围栏和原子原始操作。

在某些处理器架构(例如 Intel)上,对整数或指针的读取或写入将是原子的,只要它正确对齐内存即可。例如,请参阅http://software.intel.com/en-us/forums/showpost.php?p=31711英特尔链接不断变化,因此我无法找到最终资源。

于 2012-04-11T19:28:49.817 回答
3

volatile对多线程毫无用处,因此该选项已失效。您确实只需要一个原子变量。

于 2012-04-11T18:36:03.937 回答