Здравствуйте, Alex Fedotov, Вы писали:
AF>Если мы добавим спин-блокировку, то только отдалим тот момент, когда второй поток произведет неизбежное переключение контекста и первый поток освободит критическую секцию.
Извиняюсь что поднимаю старую тему, но никак не могу понять почему невозможен такой вариант?
-+------+---------+------------------------------------------------+-
| | | Первый поток исчерпал свой time slice, поэтому |
CPU 1: | Вход | Вставка | происходит переключение контекста на второй | -->
| | | поток |
-+------+---------+------------------------------------------------+-
\ первый поток / \
-+------------------------------------------------------------+----------+-------+- -+-
| Неудачная попытка входа, за которой следует выполнение | | | |
--> | спин-блокировки, со spincount=100 (допустим выполнилось | элемента | Выход | ... | -->
| 50 итераций из 100 до исчерпания time slice) | | | |
-+------------------------------------------------------------+----------+-------+- -+-
/ \ второй поток / \ первый поток
-+------------------------------------------------+----------------------------------------------------+- -+-
| Первый поток исчерпал свой time slice, поэтому | Началось выполнение 51-й итерации спин-блокировки, | |
--> | происходит переключение контекста на второй | на которой обнаружилось что CS не занята. | ... | -->
| поток | Т.о. обошлись без перехода в kernel mode | |
-+------------------------------------------------+----------------------------------------------------+- -+-
первый поток / \ второй поток
-+------+------------------+-------+-
| | | |
--> | Вход | Вставка элемента | Выход | ...
| | | |
-+------+------------------+-------+-
второй поток