免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1392 | 回复: 2
打印 上一主题 下一主题

求助多线程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-03 12:11 |只看该作者 |倒序浏览
代码如下
  1. import threading
  2. import time
  3. import Queue

  4. Q = Queue.Queue()

  5. Q_process = Queue.Queue()

  6. lock = threading.Lock()
  7. lock2 = threading.Lock()

  8. def do(Q, Q_process, i):
  9.     #log = build_logger('down %s'%i)
  10.     # threading loop
  11.     print 'thread %s start'%(i)
  12.     while True:
  13.         if Q.empty():
  14.             print('thread %s Queue is empty will be quit'%(i))
  15.             break
  16.         print 'wait lock %s'%(i)
  17.         if lock.acquire(1):
  18.             print 'lock in %s'%(i)
  19.             num = Q.get()
  20.             lock.release()
  21.             print 'release lock %s'%(i)
  22.         num = num * 100
  23.         print 'wait lock2 %s'%(i)
  24.         if lock2.acquire(1):
  25.             print 'lock2 in %s'%(i)
  26.             Q_process.put(num)
  27.             lock2.release()
  28.             print 'release lock2 %s'%(i)




  29. for x in range(5000):
  30.     Q.put(x)

  31. tlist = []
  32. for i in range(100):
  33.     t = threading.Thread(target = do, args = (Q, Q_process, i))
  34.     tlist.append([t,i])
  35.     t.start()


  36. for x in tlist:
  37.    t, i = x
  38.    print 'waiting %s'%(i)
  39.    t.join()
  40.    print '%s over'%(i)

  41. print '! ' * 100

  42. while True:
  43.     if Q_process.empty():
  44.         print 'empty'
  45.         break
  46.     num = Q_process.get()
  47.     print num
复制代码
100%跑死,是哪里问题?

论坛徽章:
0
2 [报告]
发表于 2013-06-03 22:10 |只看该作者
回复 1# rockyaow
第一子线程会全部阻塞在 Q.get() 第二不需要锁.

   

论坛徽章:
0
3 [报告]
发表于 2013-06-19 14:18 |只看该作者
你先判断 Q.empty(), 然后加锁, 再Q.get()。 在你判断非空与加锁之间其他线程可能get()了队列的数据, 导致当前进程 Q.get() 阻塞。
应该把锁加到 Q.empyt() 之前( Q.empty(): break 的时候记得 release() )。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP