Каковы условия гонки, которые происходят, когда мы используем семафоры вместо завершения - PullRequest
0 голосов
/ 11 октября 2019

Я все еще пытаюсь понять преимущества завершения по сравнению с семафорами.

Одним из преимуществ является то, что семафоры предназначены для неконкурентной стадии, тогда как завершение решено для противоположного.

Другое преимущество заключается в том, что при использовании семафора из приведенной ниже ссылки есть условие гонки.

http://lkml.iu.edu/hypermail/linux/kernel/0107.3/0674.html

Я не могу понять следующее утверждение:

В случае, если кому-то все равно, гонка состояла в том, что семафоры Linux защищают только доступы внутри семафора, в то время как доступы самими семафорами могут «гоняться» во внутренней реализации. Это помогает сделать эффективную реализацию, но это означает, что гонка была: cpu # 1 cpu # 2 DECLARE_MUTEX_LOCKED (sem);.. вниз (& sem);до (& СЭМ);вернуть;wake_up (& sem.wait) / BOOM / где waker по-прежнему касается структуры данных семафора после того, как спящий стал счастлив, что он больше не заблокирован - и освободил структуру данных за счет освобождения стека.

Может кто-нибудь помочь мне понять реальную проблему, как генерируется это состояние гонки? У нас есть два разных потока, поэтому у нас не будет двух разных стеков. Как семафор распределяется между двумя разными потоками, когда он находится в стеке.

...