LINUX.ORG.RU

Вопрос о SEM_UNDO в semop()


0

0

Слышал что есть "подводные камни" при использовании SEM_UNDO в функции semop(), но нигде так и не нашел внятного описания в чем они заключаются. Может кто-нибудь скажет о что-нибудь об "подводных камнях" в SysV семафорах.

Если я правильно помню, то есть ограничение (во всяком случае в Линукс) на число операций с флагом SEM_UNDO, где то 8000. А дальше операции перестают выполняться. То есть вроде было так, что если в цикле занимать/освобождать семофор, то ядро запоминает все операции и достаточно быстро UNDO буфер заканчивается.

mky ★★★★★
()

Достал с полки запылившийся том Стивенса. Прочитал раздел "11.3 функция semop". В общем, Стивенс не упоминает каких-либо "подводных камней" там.

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

>Если я правильно помню, то есть ограничение (во всяком случае в Линукс) на число операций с флагом SEM_UNDO, где то 8000. А дальше операции перестают выполняться. То есть вроде было так, что если в цикле занимать/освобождать семофор, то ядро запоминает все операции и достаточно быстро UNDO буфер заканчивается.

Блин а я думал, что SEM_UNDO создает одну единственную структуру уникальную для пары процесс - семафор. И в ней хранится смещение в занятых ресурсах относительно того что было бы если процесс ресурсы не занимал, и соответственно нет ограничений на количество операций с SEM_UNDO. А при смерти процесса происходит откат в виде вычитания. А вот если все так как сказано, значит количество операций, которые можно совершить над одним семафором ограничено для данного процесса и это само по себе одна большая "грабля".

kol65536
()

Насколько мне известно две операции semget (создание семафора) и semctl(_id, 0, SETVAL, (int)1) (инициализация семафора начальным значением) НЕ являются атомарными (в смысле обе сразу, по отдельности они конечно же атомарны).

kol65536
()

Я лет когда-то давно налетел на этот подводный камень, думал баг в ядре, отписался разработчикам, а оказалось, что это не баг, а фича :)
Пришлось отказаться от использования SEM_UNDO в своем коде.

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