Разница между мьютексом, семафором и спин-замками

Я делаю эксперименты с IPC, особенно с Mutex, Semaphore и Spin Lock. Что я узнал, так это то, что Mutex используется для асинхронной блокировки (со сном (в соответствии с теориями, которые я читаю в NET)). Механизм, семафор - это механизм синхронной блокировки (с сигнализацией и сном), а спиновые блокировки - синхронные, но не спящие.

Может кто-нибудь помочь мне прояснить эти вещи глубоко? И еще одно сомнение касается Mutex, когда я писал программу с помощью thread & mutex, когда один поток работает, другой поток не находится в состоянии сна, но он постоянно пытается получить блокировку. Так что Mutex спит или не спит???

3 ответа

Решение

Во-первых, запомните цель этих "синхронизирующих объектов":

Эти объекты были разработаны для обеспечения эффективного и согласованного использования "общих данных" между более чем одним потоком из одного процесса или из разных процессов.

Эти объекты могут быть "приобретены" или "выпущены".

Вот и все!!! Конец истории!!!

Теперь, если это поможет вам, позвольте мне положить мою песчинку:

1) Критический раздел = пользовательский объект, используемый для разрешения выполнения только одного активного потока из множества других в рамках одного процесса. Другие не выбранные темы усыпляются.

Нет возможности межпроцессного, очень примитивный объект.

2) Семафор Mutex (также известный как Mutex) = объект ядра, используемый для разрешения выполнения только одного активного потока из множества других, в рамках одного процесса или среди разных процессов. Другие не выбранные темы усыпляются. Этот объект поддерживает владение потоком, уведомление о прекращении потока, рекурсию (множественные вызовы "получения" из одного потока) и "предотвращение инверсии приоритетов".

Межпроцессная возможность, очень безопасная в использовании, своего рода объект синхронизации "высокого уровня".

3) Подсчет семафора (он же семафор) = объект ядра, используемый для разрешения выполнения группы активных потоков из множества других, в рамках одного процесса или среди разных процессов. Другие не выбранные темы усыпляются.

Однако возможность межпроцессного использования не очень безопасна, поскольку в ней отсутствуют следующие атрибуты 'mutex': уведомление о завершении потока, рекурсия?, 'предотвращение инверсии приоритета'? И т. Д.].

4) А теперь, говоря о спин-замках, сначала несколько определений:

Критическая область = область памяти, совместно используемая двумя или более процессами.

Lock = Переменная, значение которой разрешает или запрещает вход в "критическую область". (Это может быть реализовано как простой "логический флаг").

Ожидание при занятости = постоянное тестирование переменной до появления какого-либо значения.

В заключение:

Spin-lock (он же Spinlock) = блокировка, которая использует занятое ожидание. (Получение блокировки производится с помощью xchg или аналогичных атомарных операций).

[Нет спящего потока, в основном используется только на уровне ядра. Неэффективный для кода уровня пользователя.

В качестве последнего комментария я не уверен, но могу поспорить с вами, что большие первые три синхронизирующих объекта (#1, #2 и #3) используют этот простой зверь (#4) в качестве части их реализации.

Хорошего дня!.

Рекомендации:

-Концепции реального времени для встраиваемых систем Цин Ли с Кэролайн Яо (CMP Books).

-Современные операционные системы (3-е) от Эндрю Таненбаума (Pearson Education International).

-Программирование приложений для Microsoft Windows (4-е) от Джеффри Рихтера (Microsoft Programming Series).

Вот отличное объяснение разницы между семафорами и мьютексами:

http://blog.feabhas.com/2009/09/mutex-vs-semaphores-–-part-1-semaphores /

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

Мьютекс — это механизм блокировки, а семафор — это механизм ожидания и сигнала. Оба имеют разные приложения.

Есть очень хорошее объяснение, данное профессором IISC.

Ссылка на видео

Другие вопросы по тегам