Синхронизация потоков - блокировка приоритетов записи - PullRequest
0 голосов
/ 14 ноября 2011

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

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

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

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

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

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

1 Ответ

0 голосов
/ 14 ноября 2011

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

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

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

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

Решение:

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

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

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

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

...