Рассмотрим этот пример:
Код: Выделить всё
#include
#include
int main(){
std::atomic flag = false;
auto t1 = std::thread([](){
do_mysql_update(); // #1
mysql_query("COMMIT"); // #2
flag.store(true, std::memory_order::seq_cst); // #3
});
auto t2 = std::thread([](){
while (!flag.load(std::memory_order::relaxed)); // #4
mysql_query("SELECT ..."); // #5
});
}
С точки зрения стандарта C++ #3 не синхронизируется с #4, поэтому между #2 и #5 нет связи happen-before. То есть #2 и #5 неупорядочены, не говоря уже о том, что между #2 и #5 существует глобальная временная шкала. С этой точки зрения, #2 и #5 не обязательно будут происходить в определенном порядке, как ожидалось, даже несмотря на то, что #2 и #5 имеют некоторое наблюдаемое поведение. IIUC, мы можем наблюдать, что поведение, создаваемое #2 и #5, происходит в любом значимом порядке.
Итак, мне интересно, #1 не гарантированно будет виден #5, верно?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... another-th