Семафор против Мутекса
Семафор - это структура данных, которая используется для обеспечения одновременного доступа нескольких процессов к общему ресурсу или критическому разделу в средах параллельного программирования. Семафоры используются, чтобы избежать мертвых замков и условий гонки. Mutex (объект взаимного исключения) также используется, чтобы избежать одновременного доступа к общему ресурсу несколькими параллельными процессами..
Что такое семафор?
Семафор - это структура данных, которая используется для взаимного исключения критических разделов. Семафоры в основном поддерживают две операции, называемые wait (исторически известные как P) и signal (исторически известные как V). Операция ожидания блокирует процесс до тех пор, пока семафор не будет открыт, а сигнальная операция не позволит другому процессу (потоку) войти. Каждый семафор связан с очередью ожидающих процессов. Когда операция ожидания вызывается потоком, если семафор открыт, поток может продолжаться. Если семафор закрыт, когда потоком вызывается операция ожидания, поток блокируется и ему приходится ждать в очереди. Сигнальная операция открывает семафор, и если в очереди уже находится поток, ожидающий выполнения, этому процессу разрешается продолжить, и если в очереди нет потоков, сигнал запоминается для следующих потоков. Существует два типа семафоров, называемых семафорами мьютекса и семафорами подсчета. Семафоры Mutex допускают один доступ к ресурсу, а подсчет семафоров позволяет нескольким потокам обращаться к ресурсу (в котором доступно несколько единиц).
Что такое мьютекс?
Когда компьютерное приложение запускается, оно создает мьютекс и присоединяет его к ресурсу. Когда ресурс используется потоком, он блокируется, и другие потоки не могут его использовать. Если другой поток хочет использовать тот же ресурс, он должен будет сделать запрос. Затем этот поток будет помещен в очередь, пока первый поток не закончится с ресурсом. Когда первый поток завершит работу с ресурсом, блокировка будет удалена, и поток, ожидающий в очереди, сможет получить доступ к ресурсу. Если в очереди ожидают несколько потоков, они получают доступ по очереди. Практически, когда мьютекс чередует доступ к ресурсу между несколькими потоками, он будет виден, поскольку несколько потоков потребляют ресурс одновременно. Но внутренне только один поток обращается к ресурсу в данный момент.
В чем разница между семафором и мьютексом?
Несмотря на то, что и семафоры, и объекты мьютекса используются для достижения взаимного исключения в средах параллельного программирования, они имеют некоторые различия. Объект мьютекса позволяет только одному потоку использовать ресурс или критическую секцию, тогда как семафоры допускают ограниченное количество одновременных обращений к ресурсу (до максимально допустимого числа). С объектами мьютекса другие потоки, которые хотят получить доступ к ресурсу, должны ждать в очереди, пока текущий поток не завершит использование ресурса.