我应该使用原子还是易失性指针
Should I use atomic or volatile for pointers?
有两个线程(t1 和 t2)固定到两个不同的内核。它们都有一个共享变量,该变量是指向某个类类型的原始指针。T1 仅读取指针,T2 读取/写入指针。我应该将指针声明为易失性还是原子或两者兼而有之?
当 t2 更新此指针时,如果 t1 读取旧的或新的指针是可以的,但它不应该读取任何中间值,因为它会导致 seg 错误。
>volatile
可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要这样做。它被称为"几乎无用"的原因是,在很多情况下,这不足以保证正确的多线程行为,您需要查看内存围栏和原子基元操作。
在某些处理器体系结构(如英特尔)上,对整数或指针的读取或写入将是原子的,只要它正确对齐内存。例如,请参阅英特尔链接 http://software.intel.com/en-us/forums/showpost.php?p=31711 不断变化,因此我无法找到最终资源。
volatile
对于多线程是无用的,所以这个选项被排除在外。你确实只需要一个原子变量。
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- std::remove_pointer 无法删除 VS2012 上的常量易失性函数指针
- 从指针或引用中抛弃常量/易失性
- C++如何将其作为构造函数内的易失性指针
- 我应该使用原子还是易失性指针
- 指向易失性数据的指针(*((volatile uint32_t*)0x40000000)
- 易失性指针指向函数,在没有 typedef 的情况下使用时显示编译错误;需要帮助"void (* volatile userFunc)(void)"
- 指向非易失性数据的易失性指针