2015-01-30 2 views
0

Я не могу думать о решении этой логической задачи в питоне многопоточностьюпитона многопоточного логик отверстие

Каждого поток создается делает это:

  1. ожидание на переменное состояние C1
  2. ли необходимые работы
  3. декремент счетчика NT с использованием блокировки Lnt, чтобы темы не переписывались
  4. если NT уменьшает до нуля переменную условия состояния C2
  5. ) петля обратно в ожидании на C1

Основной поток делает это:

  1. набора счетчика NT с числом потоков, ожидающим на С1
  2. освободить все потоки, ожидающее на С1
  3. wait on C2
  4. процесс, выполняемый нитями
  5. готовность к следующей итерации
  6. петлю обратно к шагу 1

Отверстие нити могли все закончить до основного потока имеет возможность блокировать на C2. Не вероятное событие, но это может произойти. Если это произойдет, основной поток будет заблокирован навсегда. Беспорядочное решение - для основного потока делать неблокируемое ожидание и проверять счетчик. Я хочу более чистого решения. Но я не могу думать об этом.

+0

Вы объяснили, как потоки взаимодействуют с С1. Как потоки взаимодействуют с C2? Является ли переменной условия наиболее подходящим объектом синхронизации, который будет использоваться, когда вас интересует количество запущенных потоков? –

+0

C2 позволяет основному потоку ждать завершения всех остальных потоков. Когда последний поток уменьшает счетчик до нуля, он сигнализирует C2, высвобождая основной поток. –

+0

В принципе, у вас есть куча нитей, выполняющих некоторые фоновые работы, не так ли? Можете ли вы написать код, который позволяет создать один рабочий поток, который выполняет одно задание? Затем вы можете расширить это на несколько заданий, выполняемых одним потоком на первом шаге, и несколько заданий, выполняемых несколькими потоками на втором этапе. Тем не менее, событие может быть сигнализировано раньше (!), Кто-то ждет на нем, я считаю. –

ответ

0

все рабочие потоки создаются при старте программы и никогда не разрушали

def worker(): 
    global c1,c2,nt,lnt 
    while true: 
     c1.acquire() 
     c1.wait() 
     c1.release() 

     Do the computations 

     lnt.acquire() 
     nt -= 1 
     if nt == 0: 
      c2.acquire() 
      c2.notify() 
      c2.release() 
     lnt.release() 

def main(): 
    for i in range(100000): 
     c2.acquire() 
     nt = numthreads 
     c1.acquire() 
     c1.notifyAll() 
     c1.release() 
     c2.wait() 
     c2.release() 
     process computed data 
Смежные вопросы