欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 线程安全互斥锁

程序员文章站 2024-01-05 16:52:46
...

参考:https://blog.csdn.net/budong282712018/article/details/79968067
参考:https://www.cnblogs.com/hol*/archive/2012/03/04/2378947.html
发现多个线程开起来以后,代码执行很长时间后会出错。
思考了下肯定不是逻辑上的问题,因为逻辑上的问题第一次就会出错,而不是很多次以后才出错,而且出错的情况也要看概率。

分析:因为没有加Mutex(即下面的代码没有加互斥锁进行隔离),使得同时在thread中同时访问进行修改的时候出错。方法就是用mutex进行隔离,多个thread每次只有一个可以。

mutex.acquire(0)表示如果拿不到就退出(效果就是线程不会排队)
mutex.acquire(1)表示如果拿不到就挂起进行等待(效果就是之后拿到了会继续执行下去)

import threading
import time
from threading import Thread

mutex = threading.Lock()
def hint_display(self,disply_word):
    if mutex.acquire(0):
        self.HintText.setText(disply_word)
        self.HintText.show()
        time.sleep(0.5)
        self.HintText.hide()
        mutex.release()


def check_Hint_Po(self,check_frame):
    for i in range(0,len(self.receive_time)):
        if self.receive_time[i]==check_frame:
            t1=Thread(target=self.hint_display,args=('发球',))
            #t1=Thread(target=self.hint_display('发球'))
            t1.start()

    for i in range(0,len(self.swing_time)):
        if self.swing_time[i]==check_frame:
            t1=Thread(target=self.hint_display,args=('挥拍',))
            t1.start()
    for i in range(0,len(self.score_time)):
        if self.score_time[i]==check_frame:
            t1=Thread(target=self.hint_display,args=('得分',))
            t1.start()

上一篇:

下一篇: