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
您可以使用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不能保证之前被调用Process,Process可能会遭受ABA 问题。
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |