LINUX.ORG.RU

А нафига существуют мьютексы, когда есть семафоры?

 


0

4

В начале у тебя семафор содержит 1.

Надо залочить — декремент до нуля (больше никто в секцию не зайдёт), надо разлочить - инкремент с 0 до 1 обратно.

Нафига мьютексы в природе вообще возникли, избыточно же.

Ответ на: комментарий от I-Love-Microsoft

зачем сделали косинус, если его все равно можно получить из синуса?

С инженерной точки зрения - пёс его знает, аналогично сабжу.

hlamotron
() автор топика
Ответ на: комментарий от Dead

Семафоры штука хорошая, но больно тяжелая.

А нельзя было лёгкий сделать? Бросить на это лучшие умы и победить?

hlamotron
() автор топика
Ответ на: комментарий от outsider

давай определение мьютекса

Пердь, обеспечивающая взаимоисключающее исполнение. Мутуал экзекьюшн.

Примитив синхронизации, позволяющий реализовать «критическую секцию» — гарантировать исполнение некоего куска кода только одним тредом.

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет освобождён.

outsider ★★
()
Ответ на: комментарий от anonymous

Mutex - это частный случай семафора и всего то

А нафига было плодить частные случаи в виде отдельных концепций? Никто ж не делает в файловой системе разные типа .txt файлов — один типа для блокнота, второй для логов...

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Потому что в 90% случаев нужен одноместный лок. Просто одноместный лок. И реализовуют его как семафор. А могут на критических секциях сделать.

А семафор на критических секциях не сделаешь нормально

anonymous
()
Ответ на: комментарий от anonymous

А семафор на критических секциях не сделаешь нормально

А чё такое вообще «семафор на критических секциях»? Семафор - туда можно постить (инкрементить) и декрементить инты, как это вообще на критических секциях можно даже ПОДУМАТЬ сделать? )

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

типа xml/html/любые другие форматы файлов, которые можно открыть текстовым редактором тоже txt, хотя обратное не верно.

peregrine ★★★★★
()

Самое главное различие в том, что мьютекс может быть освобожден только захватившим его потоком (захватил, что-то сделал, освободил), а семафор может захватываться и освобождаться разными потоками (Поток А: я готов обработать следующий запрос, подожду-ка я семафор. Поток Б: пришла следующая порция данных, поставлю в очередь, просигналю семафором)

German_1984 ★★
()

Бывают рекурсивные мютексы, рекурсивных семафоров не встречал.

anonymous
()
Ответ на: комментарий от German_1984

Самое главное различие в том, что мьютекс может быть освобожден только захватившим его потоком

Это утверждение из теории или из практики? Так-то в Linux тредах лочить можно в одном треде, а разлачивать в другом. Хотя такое пожалуй редко используется.

Dead ★★★★
()
Ответ на: комментарий от kirk_johnson

Упал штоле?

Чорт!
Точно UB. Хотя тестовый пример работал. Но на то оно и UB.

Dead ★★★★
()
Ответ на: комментарий от Weres

У него другая семантика.

Это позволяет делать всякий ThreadSafetyAnalysis с аннотациями вида GUARDED_BY, который проверяет, что общие данные меняются только под мьютексом, ищет потенциальные дедлоки. Описывать это в терминах семафоров было бы странно.

Ещё модели памяти с acquire/release-операциями позволяют при работе с мьютексом сбрасывать только нужные кеши (семафор, который при уменьшении на один обладал бы acquire-семантикой, а при увеличении на 1 — release-семантикой, был бы странным).

В крутых планировщиках знают, что нормальные программы под мьютексом долго не сидят, и чуть дольше не вытесняют нить, если она недавно захватила мьютекс. Опять же, наделение семафора таким поведением было бы странным.

Ещё есть более сложные примитивы синхронизации, например, conditional variables. Они уже зависят от мьютексов.

vzzo ★★★
()
Ответ на: комментарий от vzzo

В крутых планировщиках знают, что нормальные программы под мьютексом долго не сидят, и чуть дольше не вытесняют нить, если она недавно захватила мьютекс.

Захват mutex - это запись в атомарную переменную. Как планировщик в ядре узнает про запись в переменную в пользовательском процессе?

Или для тебя крутой планировщик - это нечто из реалтаймовых систем, где захват mutex включает в себя взаимодействие с ядром и в результате время захвата mutex будет дольше, чем выполнение всего кода, защищенного mutex'ом.

Или, может, в Linux реализовали то, о чем я мечтаю - некую атомарную переменную, отображенную в ядро, запись в которую означает, что userspace просит не переключать его некоторое время и планировщик в ядре учитывает этот флаг (например, встретив его в первый раз, сохраняет timestamp, а встретив второй раз сравнивает сохраненный timestamp и решает подождать с переключением еще или, таки, переключить задачу и таким образом исключает злоупотребления).

anonymous
()
Ответ на: комментарий от anonymous

К сожалению, реализовано не в линуксе. Мьютекс правда там немного хитрее, чем запись в атомарную переменную, но всё ещё не требует сисколла при маленьком contention.

Реализовано примерно как описано в последнем абзаце — тред при захвате мьютекса пишет rdtsc куда-то в район [gs:8192], то место, которое решает, запускать ли планировщик, это учитывает.

vzzo ★★★
()
Ответ на: комментарий от vzzo

В системе же два варианта мьютекса можно создать - для тредов внутри процесса и для синхронизации разных процессов. Наверное это всех путает :)

anonymous
()

Нафиг нужны семафоры, когда есть мьютексы? Я вот честно — мьютексами часто пользуюсь, а семафорами не пользовался никогда!

anonymous
()
Ответ на: комментарий от buddhist

А уж механика Лагранжа - это единственное, что нужно знать, взвешивая картошку на рычажных весах.

dzidzitop ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.