前言:最近学习使用协程,网上搜索一番,大多是讲协程在多个任务间切换有多好用,可能是我功底太薄,愣是摸索了很久才搞懂。现在分享下新手学习心得。
结论:对称协程就相当于状态机,各个协程就是各个任务,执行到阻塞操作时,比如sleep,调度的线程并不是真的一头扎进sleep函数,然后线程挂起,而是将这个任务设置为挂起状态,然后线程返回,执行其他任务去了,等sleep的时间到了,再调度过来执行后面的代码。很显然,sleep已经不是原来的sleep了,这儿是使用了hook函数(见hook函数解释)。那线程返回了,那些临时变量怎么办?sleep后回来执行怎么恢复这些数据?这里协程把临时变量声明也hook了,这些临时变量被分配保存到了堆空间。线程返回时根本就没释放!当然,协程执行完了就释放了。
hook函数:大概就是底层函数实现的时候,第一句就是判断有没设置了hook函数,就一个函数变量,如果是NULL,那就啥事没有执行具体操作,如果设置了,那就先调用你设置的函数。所以hook可以用来做木马病毒,hook了键盘输入,你输入的东西先复制一份发出去再继续交给系统处理。当然,我们的远程桌面工具也是用这个原理做的,把你鼠标键盘的输入劫持住,不传入系统,传到远程的电脑去了。具体可参考这篇博客:https://www.cnblogs.com/unnamedfish/p/8