多线程开发常见问题
2023-08-31
创建线程有个数限制吗?最多可以创建多少个
有限制,最多16个。
线程栈大小是多少?
默认8192字节,展锐平台创建线程支持最大65535字节,ASR平台和CAT M平台创建线程支持最大的栈大小代码中未设置上限。
如何判断线程状态是否正常
多线程编程时,建议在主线程中对其他子线程进行监控,避免其他子线程出现异常情况停止工作等情况导致工作异常。
多线程功能中未看到信号量相关接口,该如何实现信号量的功能呢
QuecPython 的多线程模块的实现继承于标准 Python 的_thread,没有提供信号量相关接口。
如果想实现类似信号量的功能,可使用 互斥锁(_thread.allocate_lock
方法)或消息队列(queue.Queue
方法)。
如果信号量的最大值只有1,可使用互斥锁或消息队列实现信号量的功能;如果信号量的值大于1,可使用消息队列实现信号量的功能。
使用互斥锁实现信号量功能的基本思路为:
创建互斥锁对象
互斥锁对象创建成功后,立即上锁(此时能获得锁,接口调用后会立即返回)
需要等待信号量的地方,调用上锁接口(此时无法获得锁,接口阻塞,等待别人释放锁,用来模拟等待信号量的行为)
有事件发生的地方,调用释放锁的接口(此时锁被释放,等待信号量的地方获得锁,接口返回,用来模拟释放信号量的行为)
使用消息队列实现信号量功能的基本思路为:
创建消息队列对象(队列的size即为信号量的最大值)
需要等待信号量的地方,调用等待消息的接口
有事件发生的地方,调用发送消息的接口(如果是单纯的信号量,不关心消息内容,可以发送一个值为
None
消息,等待信号量的地方忽略获取到的消息内容)
线程执行完毕后直接退出会造成内存泄漏或系统异常吗?
线程执行完毕后可直接退出,系统底层会自动释放资源,不会造成内存泄漏或系统异常。