webrtc是一个多线程系统, 所以需要对线程有一定的基础.
计算机组成原理
这个计算机系统被南桥芯片和北桥芯片分成了两大部分, 其中北桥芯片连接着内存、CPU、显示器, 南桥芯片连接着网卡、声卡、鼠标、键盘.
最初的计算机都是单核CPU,在没有操作系统的情况下 一次只能执行一个任务, 效率很低.
后来CPU的处理速度提升以后,在操作系统的管理下, 通过底层的时间片切换机制, 实现了多线程任务的同时执行.
在往后出现了多核CPU, 才真正实现的多任务多进程的同时执行.
多线程的好处与坏处
-
好处是可以充分利用CPU资源
-
坏处是管理起来比较麻烦, 尤其是访问共享资源的时候
多线程带来的一些问题
-
原子问题: 多线程执行的每一条语句,在底层都是有多条语句完成的, 每条语句又可能调用了不同的线程去操作. 例如: 上层执行"a=a+1", 底层的逻辑就是先获取a的值, 在把a+1, 然后在把新的值写入内存, 如果上层还有另一个同样的"a=a+1"语句, 结果应该是a+2, 但实际却是a只加了1, 这种冲突就是原子问题.
-
有序性问题: 在访问一个共享资源的时候, 本来应该是先执行A线程,再执行B线程,如果控制不好,那么可能出现B线程先于A线程执行.
-
可见行问题: 多核芯片中,每个核都有自己的缓冲区, 执行的操作只是在自己的缓冲中作了操作,而没有及时更新到主内存中, 而此时如果另外一个CPU更新了主内存中的数据,而没有被该CPU观察到, 就造成了可见性问题.
要解决以上问题 就需要使用锁.
锁的种类
-
读写锁: 最常用, 当一个线程加了读锁之后, 其他持有写锁的线程都不能对资源进行访问; 当一个线程加了写锁之后, 其他持有读锁和写锁的线程也都不能对该资源进行访问.
-
自旋锁: 不停的尝试对某个资源进行加锁, 直到将锁加上. 所以对这类锁来说,我们访问资源一定是时间很短的,瞬间用完然后释放掉,否则这时候自旋锁就会大量的浪费CPU.
-
重入锁: 同一个线程对一个资源反复加锁, 多用于系统底层.
通过锁解决资源共享的办法
-
互斥
-
同步
使用锁时注意点
-
防止死锁
-
为了提高效率, 要更好的进行资源的划分, 减少锁的时间,提高效率
-
尽量减少线程之间的资源共享,减少锁的使用,提高执行效率