Я бы предложил использовать барьер для синхронизации потоков, чтобы они оба закончили чтение 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, но это не так.