Простите меня, если это было задано раньше. Я много оглядывался, но я чувствую, что у меня нет подходящего словарного запаса, чтобы найти это, обыскав в Интернете.блокировка потока на основе значений
У меня многопоточное приложение в python. Я хочу иметь возможность блокировать определенный блок кода, но только для других потоков с определенным условием. Позвольте привести пример: Есть три потока: thread_a
, thread_b
и thread_c
. Каждый поток может проходить через функцию foo
в любое время. Я не хочу, чтобы два потока с bar
равны друг другу, чтобы иметь возможность одновременно получать доступ к Code block ALPHA
. Однако я не хочу блокировать потоки, значение bar
отличается. В этом случае, скажем, thread_a
имеет bar == "cat"
и попадает в линию (3)
. До thread_a
показывается строка (5)
, скажем thread_b
, с bar == "cat"
показов линии (3)
. Я хотел бы для thread_b
ждать. Но если приходит thread_c
, с bar == "dog"
, я бы хотел, чтобы он продолжал идти.
(1) def foo(bar):
(2)
(3) lock(bar)
(4) # Code block ALPHA (two threads with equivalent bar should not be in here)
(5) unlock(bar)
В другой записке, возможные значения для bar
совершенно непредсказуемы, но с очень высокой вероятностью столкновения.
Благодарим за помощь. Библиотека Я смотрю на это python threading library
Является ли 'бар' конечным? Если это так, вы можете настроить столько мьютексов, сколько хотите, а затем заблокировать мьютекс, который соответствует любому значению «bar», которое имеет ваш поток. – numeral
@ нумерация, хороший вопрос. Бар не является конечным в том смысле, что вы могли бы разумно выделить мьютекс для каждого возможного случая. Я буду обновлять свой вопрос, чтобы отразить это. –
В этом случае единственное, что я могу придумать, это то, что вам нужно будет следить за тем, что «бар» вы встретили и заблокировали динамически. Все, что я думаю, имеет какую-то модель разделяемой памяти. Это означает, что вам понадобится мастер-замок, который заблокирует все ваши динамические блокировки. Другими словами, у вас будет только один мьютекс, который заблокировал бы все потоки. Извините, не смог. :/ – numeral