ST 库的协程阻塞函数如下:
如上图,阻塞函数 st_poll()
,st_usleep()
,st_mutex_lock()
等等,这些函数的返回值都有可能是 -1
,被中断了。本文主要讲解这样中断什么情况会发生。请看下图:
如上图所示,每个阻塞函数,都是在 _ST_SWITCH_CONTEXT()
之后判断一下 协程的 flags
有没 _ST_FL_INTERRUPT
(中断) 标志。那这个 _ST_FL_INTERRUPT
是在什么地方打上去的呢?下面就来详细分析一下。
只有一个地方对 flags
添加 _ST_FL_INTERRUPT
标记,就是 st_thread_interrupt()
函数,如下:
st_thread_interrupt()
的代码比较简单,其实就是 打上 _ST_FL_INTERRUPT
标记,然后把 协程 状态改成 _ST_ST_RUNNABLE
。
ST 没有任何一个地方使用了 st_thread_interrupt()
函数,这个函数是ST库留给程序员自己用的,如果你想中断某个协程,不再等待,就可以调这个函数。把协程传进去这个函数就行了。
相关阅读:
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。