Код: Выделить всё
// 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);
Проблема в том, что поток B не может прочитать кэшированные данные из Redis, только если поток A удалит кэшированные данные. А операция удаления происходит после фиксации транзакции. Из реализаций все эти операции являются внешними операциями ввода-вывода, побочные эффекты которых неизвестны реализациям; реализации были бы очень консервативны, чтобы переупорядочить эти операции.
Вместо этого, с точки зрения абстрактной машины, нам просто нужно провести формальные рассуждения. Итак, мне интересно, можем ли мы просто рассматривать эти внешние операции ввода-вывода (многопоточные безопасные) как операции seq_cst, чтобы выполнять многопоточное анализ наблюдаемого поведения с точки зрения единого общего порядка?
Подробнее здесь: https://stackoverflow.com/questions/798 ... he-reasoni
Мобильная версия