Здесь, в этом примере, я предполагаю, что мы находимся в системе X86 по крайней мере с двумя физическими ядрами, а поток № 1 и № 2 работает на собственном ядре ЦП (истинный параллелизм):
[initial state]
shared_memory_location = 0;
[thread #1]
shared_memory_location = 1;
signal();
[thread #2]
wait_for_signal();
print(shared_memory_location);
Какое значение shared_memory_location
в потоке # 2?
Это мое мнение: это может быть либо 0
, либо 1
, но модель согласованности X86 гарантирует, что любое чтение после записи в ячейку памяти будет считывать новое значение независимо от того, какое ядро ЦП это чтение. происходит на.
Модель согласованности X86 гарантирует, что второе физическое ядро, выполняющее поток # 2, не получит недопустимое значение из частного кэша ядра ЦП. X86 делает это намного проще, но нет никаких гарантий, что любая другая система, такая как ARM, будет вести себя таким образом.
Если бы у вас не было модели согласованности X86, как бы вы обеспечили, чтобы поток № 2 мог прочитать новое значение, когда оно было передано из потока № 1?
... или, что еще важнее, как передать значение потоку, который ожидает сигнала правильным образом?
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я могу быть совершенно неправ относительно модели согласованности X86, пожалуйста, исправьте меня, если я!