c++ - std::atomic 加载和存储都需要吗?

标签 c++ multithreading c++11 interrupt atomic

根据this article :

Any time two threads operate on a shared variable concurrently, and one of those operations performs a write, both threads must use atomic operations.

但是,如果较低优先级的线程是写入者,而较高优先级的线程是读取者,那么较低优先级的线程是否需要强制执行原子存储?在我看来,只有较高优先级的线程需要强制执行原子加载:

#include <atomic>

std::atomic<T*> ptr; // assume initialized to some non-null value

void highPriThreadFcn(void)
{
    T* local_ptr = ptr.load(); // need atomic load here in case lowPriThread write/store was interrupted
}

void lowPriThreadFcn(T* some_ptr)
{
    ptr = some_ptr; // do I need an atomic store here? I'd think not, as ptr is not written to by highPriThread
}

类似的问题适用于“反向”情况(在高优先级线程中写入,从低优先级线程中读取):

void highPriThreadFcn(T* some_ptr)
{
    ptr = some_ptr; // do I need an atomic store here? I'd think not, as write to ptr cannot be interrupted
}

void lowPriThreadFcn(void)
{
    T* local_ptr = ptr.load(); // need atomic load here in case read/load was interrupted
}

最佳答案

您无法对原子变量执行非原子存储或加载。 API 确保没有办法尝试它。您所谓的“非原子商店”,

ptr = some_ptr;

实际上是一个具有连续一致排序的原子存储。请参阅atomic::operator= on cppreference .

顺便说一句,如果您正在考虑将原子变量更改为仅以原子方式执行某些操作的非原子变量:请不要这样做。每当对同一内存位置的加载和存储“可能并发”时,该标准就要求它们两者都是原子的。否则,行为是未定义的。这意味着编译器可以以破坏代码的方式进行“优化”。一个线程的优先级是否比另一个线程“更高”并不影响这一点。

关于c++ - std::atomic 加载和存储都需要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60403951/

相关文章:

c++ - 创建其他对象时如何使用同一个对象实例?

PHP 使用线程安全与否

multithreading - 互斥锁是如何工作的?互斥锁是否全局保护变量?定义它的范围重要吗?

c++ - 使用 Boost::Fiber 的多个共享工作池

c++ - x 时间后如何中止 Winsock 连接

c++ - 你能在 VS 2008 中用 C++ 创建可折叠的 #Region 之类的范围吗?

c++ - OpenCV-cvQueryFrame()

C++:无法在初始化列表中找到错误编译正常但在启动时导致崩溃

android - 为什么UI线程和Render线程不能同时运行?

c++ - lambda 的速度与内联函数