Синхронизация записи переменных с последующим чтением - PullRequest
0 голосов
/ 21 мая 2019

На разных ядрах ЦП выполняются два потока:

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.Это решение работает, но имеет два недостатка:

  1. оно медленное
  2. оно плохо передает мое намерение.Похоже, я хочу добиться взаимного исключения, но на самом деле я хочу немедленно распространять изменения.

Мое намерение здесь состоит в том, что если t1 вытесняется t2, то t2 знает, что t1 начал что-то делать, сигнализируя об этом x = true, поэтому теперь t2 знает, что нужно принять другую ветвь кода, поскольку t1 дочто-то.Если t2 выполняет переход if (x == false), когда t1 устанавливает x в значение true, это будет неудачей.

Так есть ли лучшие или более эффективные способы достижения того, чего я хочу?Меня интересует код на c ++, а также то, как базовый процессор (может быть x86) будет выполнять этот код (например, барьеры памяти и т. Д.).

1 Ответ

0 голосов
/ 21 мая 2019

Если я прочитал это правильно, у вас есть несколько видимая и сложная рабочая нагрузка, которую возьмет t1, и вы пытаетесь посоветовать скрытным людям (t2..n) не смотреть, потому что установлен какой-то флаг. Вы можете сделать это полностью, и если ваша ОС настолько плохо реализована, что вы можете записывать не оспариваемые издержки мьютекса, переключайте ОС.

Если вы сделаете эталон из двух потоков, которые вы показали, тем не менее, вы будете измерять то, что должно быть крайне маловероятным рабочим шаблоном. По крайней мере, вы не ожидаете такой схемы, если система не будет работать, поэтому все это не имеет значения.

Я, как правило, предпочитаю схему, основанную на сигналах, где значимое изменение (расчетного) состояния некоторых важных переменных приводит к предупреждению тех, кто проявил интерес к этой переменной.

...