как заблокировать для множества потоков pthread_mutex_lock

0

как вы создаете блокировку, которая блокирует различные потоки от входа в функцию? Резьба 1: A Резьба 2: C Резьба 3: C Резьба 4: B Резьба 5: C Резьба 6: B

"A", "B", "C" - это аргумент, передаваемый потоку при его создании.

поэтому, когда я блокирую эту блокировку X, все потоки, которые передаются "A" и "B", не могут продолжаться, и в критический раздел может войти только поток типа "C". Или мне нужно сделать 6 разных замков для этого примера?

Спасибо!

  • 1
    3 блокировки: A, B, C. Если вам нужен только проход C, заблокируйте A и B, войдите в критическую секцию, попробовав блокировку. И вы не упоминаете о порядке, поэтому может быть достаточно глобальной переменной.
Теги:
multithreading
pthreads

1 ответ

0

Ваше требование нечеткое, но если вы хотите, чтобы сопутствующие читатели имели одно и то же "разрешенное письмо", вам было бы лучше использовать rwlock. (Если вы просто хотите, чтобы поток "control" устанавливал, какой из A, B или C разрешен для работы, вместо того, чтобы иметь A, B и C, выполняются, когда никакая другая "буква" не запускается через управляемый код, тогда требуется другое (более простое) решение....)

В качестве первого разреза (чтобы мы могли "развить" решение в понятном для понимания способом), каждый поток:

1) приобретает замок считывателя

2) если переменная "разрешенная буква" отличается от ее буквы, они освобождают блокировку считывателя и пытаются заблокировать запись

2a) при создании блокировки записи, они изменяют разрешенное письмо самостоятельно, затем отпустите эту блокировку и перезапустите в 1) (см. Ниже)

3) выполняют свою работу

4) отпустите замок считывателя

Это использует режим "писатель", чтобы повлиять на изменение допустимой буквы. Если вам действительно необходимо разрешить некоторые потоки "разрешенных писем", которые имеют доступ на запись к общим данным, вам нужно будет изменить 3), чтобы выполнить блокировку чтения или записи на отдельном rwlock, который будет выпущен до 4).

2a) создает условие гонки, например, когда поток A получает блокировку записи, а затем устанавливает допустимую букву, когда он освобождает блокировку, поток B может получить блокировку записи, прежде чем он сможет получить блокировку чтения, чтобы выполнить некоторую фактическую работу. Затем поток B может освободить фиксатор записи и перейти к блокировке считывателя только для того, чтобы найти, что A теперь имеет его, поэтому ни один поток не прогрессирует, но и не блокируется как таковой. Независимо от того, решает ли это сам, в первую очередь это зависит от реализации очереди потоков для rwlock, а также от условий гонки, прерываний, упреждения из-за системной нагрузки и т.д. Это можно решить несколькими способами, но это легко и возможно адекватно использовать дополнительный мьютекс, чтобы запретить другим потокам блокировки записи от изменения допустимой буквы: они могут использовать trylock для этого, и если это не удается, отпустите их блокировку записи и перезапустите на 1).

Итак, мы закончили с одним или двумя rwlocks и поддержкой мьютекса....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню