协程切换回调介绍—StateThreads协程源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
StateThreads 提供了一个协程切换回调功能,当切走 协程的时候 会执行 _st_this_vp.switch_out_cb()
函数,到恢复协程的时候 会执行 _st_this_vp.switch_in_cb()
函数。
我们可以通过 st_set_switch_in_cb()
跟 st_set_switch_out_cb()
注册这两个回调函数,这样可以对协程切换进行 hook 操作。
我们修改一下 lookupdns.c
文件,如下:
//添加头文件
#include "../common.h"
//新增回调函数
int switch_count = 0;
void my_switch_in_cb(void){
_st_thread_t *thread = st_thread_self();
printf("switch_in thread %p \n", thread);
switch_count++;
};
void my_switch_out_cb(void){
_st_thread_t *thread = st_thread_self();
printf("switch_out thread %p \n", thread);
switch_count++;
};
//注册回调函数
st_set_switch_in_cb(my_switch_in_cb);
st_set_switch_out_cb(my_switch_out_cb);
完整的代码可以在 GitHub 进行下载。运行命令 以及 结果如下:
lookupdns srs.xianwaizhiyin.net ffmpeg.xianwaizhiyin.net www.xianwaizhiyin.net
可以看到,一共进行了 6 次协程切换。不过 switch_out 的日志 比 switch_in 多了几条,不是应该一样的吗?
这个我觉得是这个回调的机制不太完成,具体的原因请阅读《协程是什么时候开始运行》里面对 st_thread_exit()
函数的分析。
协程切换回调 的原理是这样的,我们注册回调函数,只是设置两个变量 _st_this_vp.switch_in_cb
、 _st_this_vp.switch_out_cb
,这两个变量是 函数指针 来的。然后在 _ST_SWITCH_CONTEXT()
的时候,就会调用这两次回调函数。如下: