Как общаться между темами с помощью wait и notify? - PullRequest
0 голосов
/ 11 февраля 2020

У меня 2 потока работают в одной и той же функции. Я хочу отредактировать структуры данных позже в коде, но я хочу убедиться, что оба потока прочитали данные и любые будущие изменения в dict_list и ans_list не будут прочитаны этими потоками. Я думал о том, чтобы использовать такие команды, как wait () и notify () непосредственно перед mutex.acquire (), но поскольку оба потока используют одну и ту же функцию, второму потоку придется ждать уведомления, которое никогда не придет.

Как мне решить эту проблему?

 def foo():

        //Reading the dict_list and ans_list here



        mutex.acquire()
        ans_list[room_no-1] = ""
        dict_list[room_no-1].clear()
        mutex.release()

1 Ответ

1 голос
/ 11 февраля 2020

Я бы предложил использовать барьер для синхронизации потоков, чтобы они оба закончили чтение sh до того, как любому из них будет разрешено писать. Все нити должны достичь барьера, прежде чем любая из них сможет продолжить.

Это может быть реализовано через Условие и счетчик. Код выглядит так:

lock = threading.Condition()
v = 0
n = 2

def barrier():
    global v # I forgot to add this line
    with lock:
        v += 1 # This was =+
        if v == n:
            lock.notifyAll()
            v = 0
        else:
            lock.wait()

Это используется как:

read
barrier()
write

Эта реализация для фиксированного числа потоков. Также возможно иметь дизайн, который работает для динамического числа c, но это не так.

...