Скажем, у меня есть fifo (named pipe), который открывается несколько раз из нескольких процессов или потоков. Все они будут вызывать select() для чтения одновременно. Если писатель приходит и записывает, скажем, один байт этого fifo, все будут заблокированы select() вызовы возвращаются одновременно или будет выбран только один поток и вернуться из select()?одновременный выбор из именованного канала
Есть ли какие-либо спецификации по этому вопросу или это будет зависящим от системы?
Причина, по которой я спрашиваю, что я хочу реализовать события сброса вручную, связанные с Windows, используя fifos. Для события ручного сброса требуется, чтобы при сигнале события все ожидающие потоки были освобождены (а не только как событие автоматического сброса).
Я мог бы использовать pthread conds для этого, но мое требование состоит в том, чтобы события делились несколькими процессами.
Спасибо.
Большое спасибо. Таким образом, вы говорите, что все потоки будут пробуждены от выбора, но это может не произойти немедленно, поэтому нам нужно предотвратить состояние гонки, когда событие будет сброшено между этими пробуждениями. К сожалению, поток управления не знает вообще, сколько ожидающих потоков, поэтому мне, возможно, придется сделать что-то более сложное, например, написать байт, прежде чем выбрать «зарегистрировать» ожидающий поток. Я подумаю об этом. –
Я думаю, мне нужен какой-то межпроцессный rwlock.Затем каждый поток, прежде чем делать select(), заблокирует его в режиме чтения, затем разблокирует его после возвращения из select, ему не нужно ничего читать из fifo. Поток, который выполняет ResetEvent, просто блокирует rwlock в режиме записи и считывает байт, который был записан во время SetEvent, а затем разблокирует rwlock. Это заставит поток управления ждать, пока каждый ожидающий поток не вернется из выбора. Так что просто нужно найти, как реализовать interprocess rwlock. –
Похоже, flock() может работать на это. –