Как заблокировать семафор с несколькими счетчиками - PullRequest
0 голосов
/ 27 мая 2019

Семафор является счетным объектом.Вопрос в том, как заблокировать его несколькими счетами?

Например, я бы хотел вызвать функцию lock(num, timeout).Он блокируется, когда доступно по крайней мере num доступных ресурсов, или происходит сбой при пропуске timeout, но ресурсы по-прежнему меньше num.

Возможно ли это в Windows?Или, может быть, с помощью pthread?

В настоящее время в Windows WaitForSingleObject уменьшает количество объектов на 1.Я думаю, что вызов WaitForSingleObject несколько раз не может решить проблему, потому что:

  1. точное время ожидания трудно достичь, и

  2. Я хочу обработатьданные (запись на диск), когда все ресурсы num доступны (запись данных большего размера происходит быстрее).Поэтому, например, если отдельно заблокировано менее num ресурсов, мне, возможно, придется освободить (сразу после того, как я заблокирую) их в следующий раз, потому что остатки по-прежнему недоступны даже по истечении времени ожидания.Я думаю, что это плохой дизайн.Нужна помощь.

1 Ответ

0 голосов
/ 15 июня 2019

После поиска в Интернете, я думаю, что нет простой и официальный способ реализовать семафор с несколькими блокировками. System V поддерживает этот тип семафоров, но я думаю, что использовать его в Windows неудобно.

Вместо этого я выбираю использование механизма условного сигнала (на основе pthreads), как упомянуто @MayurK, с одним производителем (который получает данные) и одним потребителем (который хранит данные на диск). Чтобы упростить задачу, я реализую утилиту дескриптора буфера Flex-Buffer и размещаю ее на Github. Надеюсь, что это поможет другим с подобными проблемами.

...