Тестирование семафора путем подсчета - PullRequest
1 голос
/ 09 октября 2010

Есть статья о семафорах в OS X . Автор тестирует семафор, увеличивая и уменьшая статическую переменную в двух потоках. С семафором, защищающим доступ к переменной, переменная заканчивается нулем. Без защиты переменная в конечном итоге имеет поддельное значение. Я попробовал код, и он работает. Я не понимаю, как параллельный доступ из двух потоков может повлиять на окончательное значение переменной. В конце концов, мне кажется, что это комбинация +1 и -1, которая должна быть коммутативной, верно? Я чувствую, что упускаю что-то явно очевидное, что это? :)

1 Ответ

4 голосов
/ 09 октября 2010

Проблема в том, что ++ / -- не являются атомарными.По сути, это три операции:

  1. Load
  2. Inc / dec
  3. Store

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

Вот пример

Thread A Thread B
Load 5   Load 5
Inc 6    Inc 6
Store 6  Store 6
...