На разных ядрах ЦП выполняются два потока:
t1: x = true
t2: print(x)
x изначально ложно.
, если t1 выполняется впервые, может случиться так, что x все еще находится в буфере записи ЦП иt2 печатает false.
Для синхронизации этих потоков я мог бы использовать мьютексы:
t1:
lock(mutex)
x = true
unlock(mutex)
t2:
lock(mutex)
print(x)
unlock(mutex)
, тогда, если t1 выполняется первым, t2 всегда печатает true.Это решение работает, но имеет два недостатка:
- оно медленное
- оно плохо передает мое намерение.Похоже, я хочу добиться взаимного исключения, но на самом деле я хочу немедленно распространять изменения.
Мое намерение здесь состоит в том, что если t1 вытесняется t2, то t2 знает, что t1 начал что-то делать, сигнализируя об этом x = true, поэтому теперь t2 знает, что нужно принять другую ветвь кода, поскольку t1 дочто-то.Если t2 выполняет переход if (x == false), когда t1 устанавливает x в значение true, это будет неудачей.
Так есть ли лучшие или более эффективные способы достижения того, чего я хочу?Меня интересует код на c ++, а также то, как базовый процессор (может быть x86) будет выполнять этот код (например, барьеры памяти и т. Д.).