Модели многопоточности и согласованности - PullRequest
4 голосов
/ 20 августа 2011

Здесь, в этом примере, я предполагаю, что мы находимся в системе 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, пожалуйста, исправьте меня, если я!

1 Ответ

0 голосов
/ 20 августа 2011

Если методы signal() и wait_for_signal() вызывают внутренний барьер памяти, то описанный вами сценарий не будет реализован даже в ARM, поскольку вызов барьера памяти сбрасывает данные в основную память вместо кэша частного ядра, т.е.при методе signal он сбрасывает данные в основную память, поэтому shared_memory_location будет «энергозависимой записью», а также сбрасывает данные в основную память после wait_for_signal, поэтому чтение shared_memory_locationбудет "volatile read".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...