Синхронизация потоков - блокировка приоритетов записи

Итак, я использую C в Unix-системе и имею доступ к библиотекам pthreads & semaphore.h.

Вот проблема (я полагаю, что это сводится к проблеме "блокировки приоритета писателя"):

Для простоты у меня есть два разных процесса, которые может запустить поток: A & B.

B важнее, чем A, и поэтому, если когда-либо будет запущен B, я не хочу, чтобы больше выполнялись процессы A, пока все процессы B не будут запущены. Кроме того, хотя несколько процессов A могут выполняться одновременно, одновременно может выполняться только процесс 1 B.

Текущий способ, которым я делаю это (который я считаю неправильным, неэффективным или и тем, и другим), состоит в том, чтобы процессы B требовали блокировки на все время их выполнения, а процессы A получат и немедленно снимают блокировку в начале их исполнение. Я также использую семафоры здесь, чтобы обеспечить функциональность для нескольких читателей / писателей.

По разным причинам функциональность pthread_rwlock не может использоваться в этой системе, поэтому решение не может их задействовать.

1 ответ

Решение

Если A собирается немедленно снять блокировку, но продолжать использовать любой ресурс, который вы хотите заблокировать, то зачем вам вообще начинать блокировку?

Вы сказали: - Несколько А могут работать одновременно. - Только один Б может работать одновременно.

Я предполагаю (но поправьте меня, если я ошибаюсь): -B и A не могут работать одновременно

Если вы немедленно снимете блокировку с A, то это позволит одновременно запустить B. Я что-то здесь упускаю?

Решение:

Есть механизм, который получает ресурс для потоков. Этот механизм устанавливает блокировку ресурса только один раз, когда запускается первый поток A, и освобождает его только тогда, когда все потоки A исчезают.

Иметь токен отмены для использования потоками A, который устанавливается в значение true, когда начинается поток B, а затем, когда все потоки A вышли из потока B, могут начинаться.

Поток B, очевидно, блокируется и не освобождается, пока не завершится.

Не забывайте проверять токен отмены достаточно часто в потоке A, чтобы при запросе он не занимал слишком много времени.

Другие вопросы по тегам