当设计多线程且有一定执行次序的程序,如果是原子操作我们需要设定某种内存次序,使之呈现同步关系或先行关系,保证某种强制次序的形成。
先行关系是程序逻辑顺序的基础,对于单线程,就是前面的语句先于后边的语句执行。对于多线程,就是线程甲的某条语句先于线程乙的某条语句执行,为了实现这种多线程间的先行关系,需要线程间同步关系作为基础。
线程间的同步关系,则是线程A的原子读操作,直接读取了线程B的原子写操作后的值。或线程A的读改写原子操作的读操作,直接读取了线程B的原子写操作后的值。
通过线程内的先行关系,线程间的同步关系,实现线程间的先行关系,使得多线程程序呈现某种运行次序。
以下是简单示例,辅助了解基本的线程内先行关系,线程间同步关系,线程间先行关系:
#include
#include
#include
#include
#include
std::vector<int> data;
std::atomic<bool> dataReady(false);
void readerThread()
{
// 当线程 thr1 的 writerThread() 完成原子写操作
// 线程 thr2 的 dataReady.load() 语句直接读取其存的值,确立同步关系
// 从而确立两个线程的先行关系:线程 A 先写入数据,线程 B 再读取并输出数据。
while (!dataReady.load())
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
std::cout << "The answer = " << data[0] << std::endl;
}
void writerThread()
{
//单线程内的先行关系,先普通操作写入数据,后原子写操作。
data.push_back(42);
dataReady = true;
}
auto main() -> int
{
std::thread thr1(writerThread);
std::thread thr2(readerThread);
thr1.detach();
thr2.join();
return 0;
}
先行关系和同步关系是多线程程序保证基本逻辑可实现的基础,后期会加入原子次序的影响,实现高效且有逻辑的程序。