如何使用原子指针执行双缓冲
How to perform double buffering with atomic pointers?
这里是原子新手。我的代码目前看起来是这样的(简化(:
std::atomic<Object*> object;
void thread_a()
{
object.load()->doSomething(); // (1)
}
void thread_b()
{
Object* oldObject = object.load();
Object* newObject = new Object();
// Update new object accordingly...
while (!object.compare_exchange_weak(oldObject, newObject));
delete oldObject;
}
换句话说,我的想法是让thread_b
原子性地交换共享对象(双缓冲(,而thread_a
对其执行一些工作。我的问题是:当thread_a
对其调用doSomething()
时,我能安全地假设共享对象将受到"保护"以防数据争用吗?
用load()
获取指针将是原子的,但对doSomething()
本身的调用将不是原子的。
这意味着指针可以在load()
被调用之后但在doSomething()
被调用之前交换(这意味着doSomething()
被调用在错误的、现在已删除的对象上(。
也许互斥可能是更好的选择?
我经常这样做,但是。。。具有共享指针,并且是无锁的!
你的设计有问题,正如某个程序员老兄在他的回答中所建议的那样。但是,如果您使用shared_ptr
执行此操作,并且您的程序逻辑允许,那么您就可以了。
这适用于shared_ptr
的原因是,只要对象位于其他位置,它就不会被强制删除。所以,这就是你的做法:
std::shared_ptr<Object> object;
void thread_a()
{
std::atomic_load(&object)->doSomething(); // (1)
}
void thread_b()
{
std::shared_ptr<Object> oldObject = std::atomic_load(&object);
std::shared_ptr<Object> newObject = std::make_shared<Object>();
// Update new object accordingly...
while (!std::atomic_compare_exchange_weak(object, oldObject, newObject));
}
编辑:此atomic_load
专用于shared_ptr
。这似乎在评论中引起了混乱:https://en.cppreference.com/w/cpp/memory/shared_ptr/atomic
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 如何使用原子指针执行双缓冲
- 使用 std::stringbuf 进行缓冲的效果,同时通过插入运算符'<<'执行写入