Могут ли внешние операции ввода-вывода рассматриваться как операции 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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