Синхронизация потоков - блокировка приоритетов записи
Итак, я использую 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, чтобы при запросе он не занимал слишком много времени.