多线程开发常见问题

创建线程有个数限制吗?最多可以创建多少个

有限制,最多16个。

线程栈大小是多少?

默认8192字节,展锐平台创建线程支持最大65535字节,ASR平台和CAT M平台创建线程支持最大的栈大小代码中未设置上限。

如何判断线程状态是否正常

多线程编程时,建议在主线程中对其他子线程进行监控,避免其他子线程出现异常情况停止工作等情况导致工作异常。

多线程功能中未看到信号量相关接口,该如何实现信号量的功能呢

QuecPython 的多线程模块的实现继承于标准 Python 的_thread,没有提供信号量相关接口。

如果想实现类似信号量的功能,可使用 互斥锁(_thread.allocate_lock方法)或消息队列(queue.Queue方法)。

如果信号量的最大值只有1,可使用互斥锁或消息队列实现信号量的功能;如果信号量的值大于1,可使用消息队列实现信号量的功能。

使用互斥锁实现信号量功能的基本思路为:

  • 创建互斥锁对象

  • 互斥锁对象创建成功后,立即上锁(此时能获得锁,接口调用后会立即返回)

  • 需要等待信号量的地方,调用上锁接口(此时无法获得锁,接口阻塞,等待别人释放锁,用来模拟等待信号量的行为)

  • 有事件发生的地方,调用释放锁的接口(此时锁被释放,等待信号量的地方获得锁,接口返回,用来模拟释放信号量的行为)

使用消息队列实现信号量功能的基本思路为:

  • 创建消息队列对象(队列的size即为信号量的最大值)

  • 需要等待信号量的地方,调用等待消息的接口

  • 有事件发生的地方,调用发送消息的接口(如果是单纯的信号量,不关心消息内容,可以发送一个值为None消息,等待信号量的地方忽略获取到的消息内容)

线程执行完毕后直接退出会造成内存泄漏或系统异常吗?

线程执行完毕后可直接退出,系统底层会自动释放资源,不会造成内存泄漏或系统异常。