ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
956282 Топик полностью
fk0, легенда (31.10.2019 12:14, просмотров: 119) ответил Peter_M_ на С рандеву не знаком, это из какой технологии программирования или языка?
Рекурсивный мьютекс имеет типично ещё счётчик (сколько раз захвачен в потоке) и идентификатор потока есть в любом мьютексе. В семафоре же достаточно только счётчика или даже (бинарный семафор) -- однобитовой булевой переменной. Если нужно 1000 штук, то семафор типично легче. С другой стороны, операционка столько может не вынести и возможно проще побудку процесса возложить на условную переменную (которая сигналится при любых изменениях "семафоров"), а сами "семафоры" реализовать битовым полем. Если не нужно 1000 штук, то нет смысла ломать голову, что тяжелей. Futex это не полноценный объект сихронизации, это механизм для построения объектов синхронизации. К futex'у нужно ещё в userspace иметь вспомогательную часть, реализующую уже тот же мьютекс: обычно захват-освобождение мьютекса реализуется на атомарных операциях и не требует помощи операционки, а блокировка процесса на занятом другим потоком мьютексе уже требует помощи операционки -- возникает блокировка на futex'e с которым связан адрес ячейки памяти (того же мьютекса). И когда другой поток освобождает мьютекс, то он если нужно (в мьютексе, видимо, записан признак его ожидания другим процессом -- не знаю точно, но если никто не ждёт, то и сисколлов никаких не будет) даёт сигнал операционке и та пробуждает другие потоки заблокированные на ожидании конкретной ячейки памяти. С семафором всё точно так же. От операционки по большому счёту нужно одно: уметь связывать с конкретной ячейкой памяти список ожидающих потоков (ожидающих изменения состояния примитива синхронизации размещённого в указанной ячейке), и будить потоки при изменении состояния (когда поток освобождающий тот же мьютекс даёт команду). В некоторых ОС вся обработка мьютексов, например, вынесена в, условно, сисколл. Но это дурноватое решение, т.к. накладные расходы на захват/освобождение мьютекса в случае, если он не занят, должны сводиться в хорошей ОС к нескольким машинным командам (типа LL/SC -- load link, store conditional, или CAS -- compare and swap), а не к сотням и тысячам команд сисколла.
[ZX]