关于QMutex 和QWaitCondition()

 1 from PySide2.QtCore import QThread, QWaitCondition, QMutex
 2 con = QWaitCondition()
 3 mutex = QMutex()
 4 
 5 class Worker1(QThread):
 6     #sinOut = Signal(str)
 7 
 8     def __init__(self):
 9         super(Worker1, self).__init__()
10         #设置工作状态与初始num数值
11         self.working = True
12         
13     def run(self):
14         self.sleep(1)
15         print('Worker1  lock 前')
16         mutex.lock()
17         #self.sleep(2)
18         print('Worker1 is locking')
19         i = 0
20         while 1:
21             print('work1:',i)
22             self.sleep(0.5)
23             i+=1
24             if i == 5:
25                 con.wakeAll()
26                 print('work1 is ready to sleep')
27                 
28                 con.wait(mutex)
29                 
30                 print('work1 is sleep')
31             if i == 10:
32                 break
33                 
34         print('~~~work1 unlock 前~~~')
35         mutex.unlock()
36         print('~~~work1 unlock 后~~~')
37 
38 
39 
40 
41 class Worker2(QThread):
42     #sinOut = Signal(str)
43 
44     def __init__(self):
45         super(Worker2, self).__init__()
46         #设置工作状态与初始num数值
47         self.working = True
48         
49     def run(self):
50         print('Worker2  lock  前 ')
51         mutex.lock()
52         
53         print('Worker2 is locking')
54         i = 0
55         print('woker2 准备wait')
56         con.wait(mutex)
57         print('woker2 wait 后')
58         while 1:
59             
60             print('work2:',i)
61             i+=1
62             self.sleep(0.5)
63             if i == 8:
64                 print('woker 准备 唤醒动作')
65                 con.wakeAll()
66                 print('work2 完成唤醒动作')
67             if i == 10:
68                 break
69         print('work2 unlock 前')
70         mutex.unlock()
71         print('work2 unlock 后')
72 
73 
74 w2 = Worker2()
75 w2.start()
76 w1 = Worker1()
77 w1.start()
78 
79 
80 print('____main____')

关于w1 和w2 谁先运行,可以在线程中 增加self.sleep,见 14 行

 

关于 尾巴 部分 mutex.unlock,如果不使用 情况如下:

 重点:

    con.wakeAll()
                print('work1 is ready to sleep')
                for j in range(3):
                    print('j')
                    self.sleep(1)
                
                con.wait(mutex)

线程1  中出现wakeAll 之后 不会直接调转到 B的 con.wait 后运行,而是 A继续运行  直遇到 con.wait(mutex) 或者 mutex.unlock

 

如果线程 B 中 最后 去除了mutex.unlock,那么 程序 会一直 卡着,无法 切入到 A 中:最后一次 con.wakeAll后 本来应该遇到 wait或者unlock 这种 阻挡 才能切走,但是目前 没有阻挡了,无法 反弹了

posted @ 2021-04-22 15:03  假面之风  阅读(263)  评论(0)    收藏  举报