Code: Select all
// 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);
Das Problem besteht darin, dass Thread B die zwischengespeicherten Daten nur dann von Redis lesen kann, wenn Thread A die zwischengespeicherten Daten entfernt. Und der Entfernungsvorgang erfolgt, nachdem die Transaktion festgeschrieben wurde. Von Implementierungen her handelt es sich bei diesen Vorgängen um alle externen E/A-Vorgänge, deren Nebenwirkungen den Implementierungen unbekannt sind; Die Implementierungen wären sehr konservativ, um diese Operationen neu anzuordnen.
Stattdessen müssen wir im abstrakten Maschinensinn nur formale Überlegungen anstellen. Ich frage mich also, ob wir diese externen E/A-Operationen (sichere Multithread-Operationen) einfach als seq_cst-Operationen betrachten können, um Multithread-beobachtbares Verhalten im Sinne einer einzigen Gesamtreihenfolge zu begründen?
Mobile version