三種內(nèi)存模型
這篇文章講的很好
https://www.codedump.info/post/20191214-cxx11-memory-model-2/
三種內(nèi)存模型(https://www.codedump.info/post/20191214-cxx11-memory-model-2/):
- Sequential Consistency 順序一致性惊完,簡稱SC
- Total Store Ordering, 全存儲排序僵芹,簡稱TSO
- Relaxed memory models,松弛型內(nèi)存模型
四種讀寫關(guān)系
Sequential Consistency
memory_order_seq_cst
小槐,即順序一致性模型拇派。
Acquire-Release 模式
memory_order_release
前面不會被reord到本句之后;memory_order_acquire
之后的代碼不會被reorder到本句之前凿跳;memory_order_acq_rel
同時包含acquire和release標(biāo)志件豌。
這是一段實踐代碼,代碼簡單明確:https://www.cnblogs.com/lizhanzhe/p/10893016.html
#include <thread>
#include <chrono>
#include <mutex>
#include <thread>
#include <assert.h>
#include <atomic>
std::atomic<int> a=0, b=0, c = 0;
void t1_fun() {
a = 1;
b.store(2, std::memory_order_relaxed); //relaxed控嗜,松散的
//memory_order_release茧彤,類似于mutex的unlock,自身線程中它之前的讀寫語句都會執(zhí)行完疆栏,不會被優(yōu)化到本句之后
c.store(3, std::memory_order_release);
}
void t2_fun() {
//memory_order_acquire曾掂, 類似于mutex的lock惫谤,自身線程它后面的讀寫語句一定是在后面執(zhí)行的,不會被優(yōu)化到本句之前
while (c.load(std::memory_order_acquire) != 3); // 以下 assert 永遠(yuǎn)不會失敗
assert(a == 1 && b == 2);
assert(b.load(std::memory_order_relaxed) == 2);
}
int main() {
std::thread t1(t1_fun);
std::thread t2(t2_fun);
t1.join();
t2.join();
}
Release-Consume 模式
memory_order_consume
遭殉,只約束mutex對象的memory order石挂,不約束上下文中其他變量
a = 0;
c = 0;
thread 1:{
a = 1;
c.store(3, memory_order_release);
}
thread 2:{
//consume只約束mutex對象的memory order博助,不約束上下文中其他變量
while (c.load(memory_order_consume) != 3) ;
assert(a == 1); // assert 可能失敗也可能不失敗
}
Relaxed模式
松散的险污,不約束。線程內(nèi)部可以reorder富岳。