海湾合作委员会 : __sync_lock_test_and_set VS.= 具有易失变量的运算符
gcc : __sync_lock_test_and_set VS. = operator with volatile variables
2 个线程 A 和 B 共享一个volatile int i
。
线程 A i
递增如下: __sync_fetch_and_add(&i, 1);
线程 B 将i
设置为任意值 V,如下所示:i = 15;
。
我的问题:对于这种用法,B应该使用__sync_lock_test_and_set(&i, 15);
而不是直接影响=
运算符吗?
如果是,__sync_lock_release
test_and_set之后是强制性的吗?
环境:gcc 4.1.2,centos 5.11 32 位,无 c++11
如果您不使用同步函数,则线程 A 和 B 之间存在i
的数据争用。并且根据 __sync_lock_test_and_set
和 __sync_lock_release
的定义,您应该在使用 sync_lock 后使用释放。
对于参考
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- 海湾合作委员会 : __sync_lock_test_and_set VS.= 具有易失变量的运算符