作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定这样的结构:
struct foo {
atomic_int refcount; /* atomic access */
char* bar1; /* read-only */
char* bar2; /* read-only */
};
严格来说:是否有必要对bar1
和bar2
使用atomic_intptr_t
来保证非原子变量的跨线程可见性,我是否使用了正确的获取/释放语义?
最佳答案
从抽象的角度来看,在原子变量的获取/释放操作之间发生的任何内存操作都将表现得就像您已经获取和释放了抽象互斥类型(POSIX、WinAPI 等)一样,因为这就是通常实现的方式.原子操作和定义的内存模型的一个主要目标是定义非原子内存访问如何围绕原子访问进行排序。所以它们不需要是原子的。
如果您从不写入指针,那么您只需要在结构初始化后使用内存屏障来确保初始值在其他线程中可见。如果在您的关键部分中您改变了指针所指的内容,获取/释放语义将确保这些更改也变得可见。
有用的阅读(我不确定 C11 和 C++11 的内存模型之间有什么区别): http://en.cppreference.com/w/cpp/atomic/memory_order
http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/
编辑:添加了更好的链接。
关于c - 必须在多大程度上使用原子类型来保证跨线程可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460463/
我是一名优秀的程序员,十分优秀!