我见过一些堆栈的无锁实现...我的问题是关于可见性,而不是原子性。例如,无锁堆栈的元素(不是指针)最多必须是 64 位吗?我想是的,因为你无法保证可见性。真实的例子:这个结构可以安全地插入无锁容器和从无锁容器中删除
struct person
{
string name;
uint32_t age;
}
编辑:有些人对这个问题感到困惑。解释一下:如果 writer 将 person 压入堆栈,reader 得到它,是否可以保证 reader 看到(内存可见性)person 的正确内容。
最佳答案
我可能错了,但我认为这个问题是不正确的。
原子指令通常处理单个指针长度的数据;最多有两个指针长度的数据。
典型的结构无法进行原子操作,因为它太大了。
因此,无锁堆栈将且只会操作指向元素的指针(据我所知,需要在指针长度边界上对齐 - 据我所知,没有平台不是这种情况)。
关于visibility - 无锁容器和可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582561/