伪线程使用注意事项

1)由于伪线程机制中的线程并非真正意义上的操作系统线程,因此某个伪线程挂住将使得伪线程调度器无法再继续运行,也就会造成相应的操作系统进程或线程挂住。因此,如果要求操作系统进程或线程不挂住,那么伪线程的处理中不能有挂起操作。在设计考虑的时候,通过伪线程调度机制一般情况下可以做到伪线程的处理不挂起。例如,对于socket读写操作,不再使用原先的直接尝试去阻塞读写的方式,而是添加一个读或写伪线程,伪线程调度机制在判断socket可读或者可写的时候才进行读或写操作。

2)伪线程机制是一个无限循环的机制,也就是说使用伪线程的模块将一直循环查找可以运行的伪线程,找到可运行的线程后将其调度执行。因此,在系统初始化的时候,至少需要添加一个伪线程,否则后续 进入无限循环后由于没有可运行的线程,将一直无法添加新的伪线程进去。

3)伪线程机制只允许一个操作系统线程对其进行操作,不能够有两个以上的操作系统线程(信号也可以理解成一个线程,所以也不允许信号处理函数里面相关伪线程操作)同时对一个伪线程管理器中的伪线程进行添加、删除等。也不允许另外的操作系统线程对伪线程中的socket进行关闭,否则会导致伪线程的select出现异常,只能由伪线程处理函数对socket进行关闭。

使用者如果关闭了某个socket,那么必须先把使用该socket的read/write伪线程先取消掉,否则会导致select异常并且退出伪线程调度(用户可能重分添加多个使用该socekt的伪线程,要自己保证所有的都取消)。如果某个伪线程有使用某个指针作为参数(arg),将这个参数释放前也要将有使用该参数的所有伪线程取消掉,否则伪线程执行的时候将访问野指针。

4)select机制对于socket数量很大时,效率较低,此时可能需要使用poll解决,这种情况下,无法使用伪线程机制。也就是说,使用伪线程时,socket数量不应很大,一般需要小于1024个。如果使用者socket数量大于1024那么必须在伪线程调度前设置使用poll机制替代默认的select机制。

5)伪线程的优先级机制是非抢占类型的,也就是说高优先级伪线程加入后,仍然要等当前正在运行的低优先级伪线程执行完才能得以执行。此外,如果使用pending类型的伪线程,可能造成“优先级反转”的问题,即低优先级的伪线程可能会比高优先级的伪线程先运行。

6)伪线程定时器是非精确的,即伪线程的定时器机制不保证超时时间到达时能够马上取出伪线程运行,它只能保证定时器伪线程一定是在超时时间过后被取出运行。一般情况下,只有在系统较繁忙时会导致伪线程定时器不精确。

7)使用insert方式添加伪线程,用户自己申请内存,第一次使用前必须memset,之后再次使用必须自己判断该伪线程是否已经在队列中。

8) 使用伪线程函数建议都使用有带name的伪线程接口,方便出问题调试。

发布了56 篇原创文章 · 获赞 37 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42096901/article/details/102616637
今日推荐