记一次join()卡死问题

记一次join()卡死问题

在Stop函数里面,mutex.lock()锁住,m_thread.Join(),mutex没有unlock;

在这里插入图片描述

Join()函数如下:
在述
m_thread指针调用join()函数后,主线程不动,m_thread会在join()中的WaitForSingleObjectEx()函数中等到m_thread执行完任务函数,让我们看看执行的任务函数具体什么样子,如下:
在这里插入图片描述
任务函数Loop()中会使用 lock(m_mutex),lock会尝试m_mutex.lock(),但是,第一张图内,m_mutex是上锁状态,lock会停在这里,等待m_mutex.unlock后,再次尝试m_mutex.lock(),简而言之,lock这里发生了阻塞。Join函数等待Loop()函数退出,而Loop函数等待 Join函数退出后m_mutex.unlock() 然后Loop函数内的lock将m_mutex.lock(),Join函数和Loop()互相等待,产生死锁;

解决

Stop()函数内部,不对m_mutex加锁;

Python线程卡死问题通常是由于线程死锁或者死循环等问题引起的。以下是几种解决Python线程卡死问题的方法: 1. 使用锁机制 线程死锁的问题通常是由于多个线程互相等待对方释放资源,导致所有线程都处于等待状态。可以使用Python中的锁机制来避免这个问题。例如,可以使用threading模块中的Lock来实现简单的互斥锁机制: ``` import threading lock = threading.Lock() def func(): with lock: # 可执行的代码 ``` 2. 添加超时时间 如果线程卡死在一个无法预知的操作中,可以使用超时时间来避免线程无限等待。例如,可以使用threading模块中的Timer来实现超时机制: ``` import threading def func(): # 可能会导致线程卡死的操作 t = threading.Timer(5.0, func) t.start() t.join() ``` 上述代码中,创建了一个定时器线程,在5秒后调用func函数。如果在5秒后func函数还没有执行完毕,定时器线程将会结束。可以根据实际情况调整等待时间。 3. 使用守护线程 如果一个线程在执行过程中,不需要在主线程结束之前都执行完毕,可以将该线程设置为守护线程。当主线程结束时,所有守护线程都会被强制结束。可以使用threading模块中的setDaemon方法将一个线程设置为守护线程: ``` import threading import time def func(): while True: # 可执行的代码 time.sleep(1) t = threading.Thread(target=func) t.setDaemon(True) t.start() ``` 上述代码中,创建了一个线程,并将该线程设置为守护线程。当主线程结束时,该线程也会被强制结束。 总之,线程卡死问题的解决方法多种多样,需要根据具体情况采取不同的方法来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值