如何使用原子指针执行双缓冲?

Ign*_*ant 12 c++ multithreading atomic

原子新手在这里.我的代码目前看起来像这样(简化):

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;
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我的想法是让thread_b原子交换共享对象(双缓冲),同时thread_a对它执行一些工作.我的问题:我可以安全地假设共享对象在对其进行thread_a调用doSomething()时会受到"保护" ,如(1)中所做的那样吗?

Som*_*ude 8

获取指针load()将是原子的,但对doSomething()自身的调用将不是原子的.

这意味着指针可以在load()调用之后但在调用之前进行交换doSomething()(这意味着doSomething()在错误且现在删除的对象上调用).

也许互斥可能是更好的选择?

  • @Ignorant IMO不是你实现它的方式.也许如果你使用智能指针代替.然后可能发生的最坏情况是你在一个非"活跃"的对象上调用`doSomething()`但至少它仍然存在. (2认同)
  • 智能指针是这里的关键.调用`.doSomething()`的`Object`显然必须至少存活到`.doSomething`的末尾,所以`thread_b`永远不能调用`delete`.它根本不知道`thread_a`在哪里. (2认同)