使用原子在线程之间(除了使用自旋锁之外)同步数据的常见模式如下:
int data;
std::atomic<bool> ready;
void thread1()
{
data = 123;
ready.store(true, std::memory_order_release);
}
void thread2()
{
while(!ready.load(std::memory_order_acquire));
int theData = data;
assert(theData == 123);
}
或更好:
void thread2()
{
while(!ready.load(std::memory_order_relaxed));
std::atomic_thread_fence(std::memory_order_acquire);
int theData = data;
assert(theData == 123);
}
“就绪”标志用于1)确定何时确实准备好数据,以及2)发生事前关系。
但是,如果我以某种方式(有时不是通过使用c ++原子)知道数据将在读取时准备就绪,那么我可以省略这种标志吗?
我可以使用这个吗?
int data = 0;
void thread1()
{
sleep(1000);
data = 123;
std::atomic_thread_fence(some_order);
}
void thread2()
{
sleep(2000);
std::atomic_thread_fence(some_order);
int theData = data;
assert(theData == 123);
}
或
std::atomic<int> atmData(0);
void thread1()
{
sleep(1000);
atmData.store(123, some_order);
}
void thread2()
{
sleep(2000);
int theData = atmData.load(some_order);
assert(theData == 123);
}
如果是这样,那么some_order可能是什么?
我不确定这样做是否可行,因为即使使用std::memory_order_seq_cst
,订购操作仍然可以看到过时的值。另一方面,std::atomic_thread_fence()
似乎需要原子操作才能工作(根据https://en.cppreference.com/w/cpp/atomic/atomic_thread_fence)。
编辑:这是一个关于内存同步在c ++中如何工作的理论问题,而不是关于我应该如何使用等待机制或知道何时可以安全访问数据的问题。