Есть много заблуждений относительно этих слов.
Это из предыдущего поста (https://stackoverflow.com/a/24582076/3163691), который подходит здесь превосходно:
1) Критическая секция = Пользовательский объект, используемый для разрешения выполнения только одного активного потока от многих других в рамках одного процесса . Другие не выбранные потоки (@ получение этого объекта) помещаются в sleep .
[Нет возможности межпроцессного взаимодействия, очень примитивный объект].
2) Семафор Mutex (он же Mutex) = Объект ядра, используемый для разрешения выполнения только одного активного потока от многих других, среди разных процессов . Другие не выбранные потоки (@ получение этого объекта) помещаются в sleep . Этот объект поддерживает владение потоком, уведомление о прекращении потока, рекурсию (множественные вызовы «получения» из одного потока) и «предотвращение инверсии приоритетов».
[Межпроцессные возможности, очень безопасные в использовании, своего рода объект синхронизации «высокого уровня»].
3) Подсчет семафора (он же семафор) = объект ядра, используемый для разрешения выполнения группы активных потоков от многих других. Другие невыбранные потоки (@ получение этого объекта) устанавливаются в sleep .
[Однако возможность межпроцессного использования не очень безопасна, поскольку в ней отсутствуют следующие атрибуты 'mutex': уведомление о завершении потока, рекурсия ?, 'предотвращение инверсии приоритета'? И т. Д.].
4) А теперь, говоря о «спинлок», сначала несколько определений:
Критическая область = область памяти, совместно используемая двумя или более процессами.
Lock = Переменная, значение которой разрешает или запрещает вход в «критическую область». (Это может быть реализовано как простой «логический флаг»).
Ожидание занято = постоянно проверять переменную, пока не появится какое-либо значение.
Наконец:
Spin-lock (он же Spinlock) = A блокировка , которая использует занятое ожидание . (Получение блокировки производится с помощью xchg или аналогичных атомных операций ).
[Нет спящего потока, в основном используется только на уровне ядра. Неэффективный для кода уровня пользователя.
В качестве последнего комментария я не уверен, но могу поспорить с вами, что большие первые 3 синхронизирующих объекта (# 1, # 2 и # 3) используют этот простой зверь (# 4) как часть их реализация.
Хорошего дня!
Ссылки:
- Концепции в реальном времени для встраиваемых систем Цин Ли с Кэролайн Яо (CMP Books).
-Современные операционные системы (3-е) от Эндрю Таненбаума (Pearson Education International).
-Программирование приложений для Microsoft Windows (4-е) от Джеффри Рихтера (Microsoft Programming Series).
Кроме того, вы можете взглянуть на:
https://stackoverflow.com/a/24586803/3163691