Речь о не-ембеддед, просто линукс, 2.6.18-194.32.1.el5
Мне вот непонятно кое что... Использую семафоры для обработки событий, источником которых могут быть разные процессы, одним процессом. Суть в том - создаю два семафора - "Start" и "Complete", у обоих начальное значение ноль. Процесс-сервер в sem_wait ждет семафора "start". Клиент подготавливает данный в shared memory, и постит start, после чего ждет complete. Сервер, дождавшись start-а, делает свое дело, и постит complete. Клиент идет дальше.
А глюк очень странный - тестовый "клиент" всегда работает четко, не удалось его повесить. А вот реальный клиент, а это процесс, который добирается до моей функции через целый слой shared object-ов (динамически подключаемых библиотек), умудряется наглухо вешаться в sem_wait для семафора "completed", при том, что гарантированно известно, что сервер запостил его, и семафор имеет значение 1. И, самое глючное, что при замене sem_wait на sem_timedwait с таймаутом в 10 секунд и в бесконечном цикле до тех пор, пока не дождется, все начинает работать идеально и даже не тормозит...
Вопрос: что бы это все значило? Каким макаром можно повлиять на процесс так, чтобы sem_wait не "развис" после sem_post, при этом сохраняя нормальную работу sem_timedwait? Я, конечно, понимаю, что поставив sem_timedwait я "типа решил проблему", но это сопля какая-то. Хочется понять, что там на самом деле произошло.
|