我有两个函数,它们被单独的线程调用:
void SetPtr(T* ptr_)
{
ptr = ptr_;
}
void Process()
{
if(ptr != nullptr)
{
ptr->fun(); // fun() can call Process() again
}
}
我知道在调用
Process
之前必须先调用SetPtr
,但因为这些函数由不同的线程调用,内存可能没有同步,即Process
可能会看到初始的ptr
值,或尝试读取未完全写入的ptr
。我可以使用std::lock_guard
来提供同步,但我想看看其他可能性。有哪些其他方法可以为这种情况提供内存同步?
编辑1
当SetPtr
可以随时被调用时,如何同步内存(无需互斥量)?
编辑2 ptr, SetPtr和Process
属于同一个类,ptr
最初设置为nullptr
。
Process
之前是否已经调用了SetPtr
?这非常重要,请参考ComicSansMS的答案,该答案假定您拥有坚不可摧、可移植的保证。 - MSalters