Могут ли внешние операции ввода-вывода рассматриваться как операции seq_cst при рассуждениях многопоточных программ?C++

Программы на C++. Форум разработчиков
Anonymous
Могут ли внешние операции ввода-вывода рассматриваться как операции seq_cst при рассуждениях многопоточных программ?

Сообщение Anonymous »

Рассмотрим этот пример:

Код: Выделить всё

// thread A:
start_transaction();
update_mysql();
commit_transaction();   // remove "key" from mysql tables
remove_redis_cache("key");

// thread B:
std::string msg_redis;
bool r = read_redis_cache("key",msg_redis);
if(r){
return msg_redis;
}
const std::string msg_sql = read_mysql();
update_redis_cache("key",msg_sql);
Предполагая, что в Redis существуют кэшированные данные до запуска потоков A и B. Итак, может ли в этой программе поток B прочитать старые данные из MySQL и обновить с их помощью кэш Redis?
Проблема в том, что поток B не может прочитать кэшированные данные из Redis, только если поток A удалит кэшированные данные. А операция удаления происходит после фиксации транзакции. Из реализаций все эти операции являются внешними операциями ввода-вывода, побочные эффекты которых неизвестны реализациям; реализации были бы очень консервативны, чтобы переупорядочить эти операции.
Вместо этого, с точки зрения абстрактной машины, нам просто нужно провести формальные рассуждения. Итак, мне интересно, можем ли мы просто рассматривать эти внешние операции ввода-вывода (многопоточные безопасные) как операции seq_cst, чтобы выполнять многопоточное анализ наблюдаемого поведения с точки зрения единого общего порядка?

Подробнее здесь: https://stackoverflow.com/questions/798 ... he-reasoni

Вернуться в «C++»