线程切换原理

image.png
当线程一将处理好的数据交换到线程二进行处理时,它只需将自己的输出数据/任务插入线程二的列队中即可。
image.png
Post()方法最简单,在其内部会构造一个Message对象,然后将Message对象插入队列中即完成任务。Send()方法则要复杂得多,不仅要构造Message对象并将它插入队列中,还要等待插入队列中的任务执行完后,才能继续自己的逻辑,实际上就是将Post()方法的异步处理变成了同步调用。

Post方法的定义

image.png
第一个参数posted_from用来记录发生线程切换的位置。该参数对于我们排查问题有帮助,可以快速定位到问题所在的线程,除此之外它不参与任何逻辑处理。
第二个参数phandler最为重要,它是一个包含OnMessage()方法的类对象。当线程发生切换时,目标线程会调用该参数的OnMessage()方法做进一步的逻辑处理。
第三个参数id表示消息ID,当源线程处理的数据包含多种类型(如音频和视频)时,目标线程可以通过该参数对数据进行区分。
第四个参数pdata表示一个数据指针,目标线程需要处理的数据就存放在该指针所指向的地址中。
最后一个参数time_sensitive已被淘汰,该值应该一直为false。
image.png

目标线程的处理逻辑

image.png
image.png

学习资料

《WebRTC音视频实时互动技术:原理、实战与源码分析-李超编著》——线程切换