C++多线程-内存同步

Irb*_*bis 5 c++ multithreading c++11

我有两个由单独线程调用的函数:

void SetPtr(T* ptr_)
{
   ptr = ptr_;
}
void Process()
{
   if(ptr != nullptr)
   {
      ptr->fun(); // fun() can call Process() again
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道在SetPtr有人可以调用之前调用Process,但是因为这些函数是由单独的线程调用的,所以内存可能不会同步,即可能会Process看到初始ptr值或可能尝试读取ptr未完全写入的值。我可以用来std::lock_quard提供同步,但我想看看其他可能性。对于这种情况,还有哪些其他方法可以提供内存同步?

Edit1 当可以随时调用 SetPtr 时如何同步内存(没有互斥)?

Edit2 ptr, SetPtr and Process属于同一个类,ptr初始设置为nullptr

Dav*_*aim 1

您可以使用std::atomic<T*>

std::atomic<T*> ptr;
void SetPtr(T* ptr_)
{
   ptr.store(ptr_, std::memory_order_release);
}
void Process()
{
   auto _ptr = ptr.load(std::memory_order_acquire);
   if(_ptr != nullptr)
   {
      _ptr->fun(); // fun() can call Process() again
   }
}
Run Code Online (Sandbox Code Playgroud)

正如你所说,SetPtr之前被调用过Process,所以这个设计适用于这种方法。如果SetPtr不能保证之前被调用ProcessProcess可能会遭受ABA 问题