Код: Выделить всё
#include
#include
extern char* mysql_query(char const*);
extern char* do_mysql_update();
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 ... for shared"); // #5
});
t1.join();
t2.join();
}
Следующее определяет наблюдаемое поведение программы:
- Доступы через изменчивые glvalues оцениваются строго в соответствии с правилами абстрактного машине.
- Данные доставляются в хост-среду для записи в файлы.
Доступы через изменчивые значения glvalue могут оцениваться в любом порядке, поскольку happen-before не происходит. Аналогично, данные могут доставляться в любом порядке. Таким образом, реализация может выполнить переупорядочение в соответствии с правилом «как если бы», не нарушая наблюдаемого поведения.
Итак, мне интересно, #1 не гарантированно будет виден #5 с точки зрения стандарта C++. Верно ли это понимание?
Подробнее здесь: https://stackoverflow.com/questions/798 ... another-th
Мобильная версия