同步发生与先行发生
“同步发生”关系是指:只能在原子类型之间进行的操作。例如对一个数据结构进行操作(对互 斥量上锁),如果数据结构包含有原子类型,并且操作内部执行了一定的原子操作,那么这些操作就是同步发生关系。
“先行发生”关系是一个程序中,它指定了某个操作去影响另一个操作。对于单线程来说,如果源码中操作A发生在操作B之前,那么A就先行与B发生。
控制线程顺序
假设你有两个线程,一个向数据结构中填充数据,另一个读取数据结构中的数据。为了避免恶性条件竞争,第一个线程设置一个标志,用来表明数据已经准备就绪,并且第二个线程在这个标志设置前不能读取数据。
#include <vector>
#include <atomic>
#include <iostream>
std::vector<int> data;
std::atomic<bool> data_ready(false);
void reader_thread()
{
while(!data_ready.load())
{
std::this_thread::sleep(std::milliseconds(1));
}
std::cout<<"The answer="<<data[0]<<"\m";
}
void writer_thread()
{
data.push_back(42);
data_ready=true;
}
当写入数据完成之后,data_ready就会作为信号,通知读取进程可以工作了。