Я бы предпочел переписать network_method (), чтобы он проверял, удерживается ли блокировка, и если это так, отпустите его перед запуском и снова получите в конце.
Обратите внимание, чтоnetwork_method () иногда вызывается из других мест, поэтому она не должна снимать блокировку, если она находится не в потоке, который ее удерживает.
Это просто звучит как совершенно неправильная вещь: (
Для начала, плохо иметь функцию, которая иногда имеет какой-то другой магический побочный эффект, в зависимости от того, откуда вы ее вызываете. Это такая кошмарная вещь для отладки.
Во-вторых, блокировка должна иметь четкую семантику получения и выпуска. Если я посмотрю на код, который говорит «lock (); do_something (); unlock ();», то я ожидаю, что он будет заблокирован на время выполнения do_something (). Фактически, это также говорит мне, что do_something () требует блокировки. Если я узнаю, что кто-то написал определенную функцию do_something (), которая фактически разблокирует блокировку, которую я только что виделбыть заблокированным, я либо (а) уволить их или (б) выследить их с оружием, в зависимости от того, нахожусь ли я на позиции старшего по отношению к ним или нет.
Кстати,Блокировка - это глобальный объект, и я в порядке.
Кстати, именно поэтому глобальные переменные плохие.Если я изменяю значение, вызываю функцию, а затем снова изменяю значение, я не хочу, чтобы эта функция посередине могла выйти назад и изменить это значение непредсказуемым образом.
Мое предложениедля вас это: ваш замок находится не в том месте, или вы делаете не то, или другое.Вы говорите, что эти методы не должны запускаться одновременно, но вы на самом деле хотите, чтобы некоторые из них запускались одновременно.Тот факт, что один из них является «медленным», не может сделать приемлемым удаление блокировки - либо вам нужно взаимное исключение во время этого типа операции, чтобы оно было правильным, либо нет.Если более медленная операция действительно безопасна, когда другие нет, тогда, возможно, она не нуждается в блокировке - но это подразумевает, что блокировка должна идти внутри каждой из более быстрых операций, а не вне их.Но все это зависит от того, для чего именно предназначена блокировка.