线程池及红黑树复习--Apple的学习笔记

FFmpeg也算是入门了。回顾我之前理解的流媒体开发就是指FFmpeg是错误的,因为流媒体开发主要是指网络视频,否则就是视频播放编辑器了。但是我的主攻方向还是围绕图形图像,而网络方面的协议RTSP,RTMP等,更加侧重于服务器开发。所以我决定网络协议方面暂不做探究。之前学习过协程,我应该用不到,所以我想先复习下线程池,其实我认为也是服务器要用到的,估计我也用不到。作为基础复习下。因为最基础的东西才是可迁移最强的。然后在了解协程的过程中我也了解了它的调度优先级采用了红黑树,关于树我已经忘的一干二净了,其实linux内核的进程调度也是用红黑树。我就一起复习下吧!

一,线程池

线程池允许一个线程可以多次复用,且每次复用的线程内部的消息处理可以不相同,将创建与销毁的开销省去而不必来一个请求开一个线程。
我参考了一个简单的线程池的设计实现,里面没有优先级的处理。初始化的时候就一次性打开一定数量的线程,然后采用生产者 ->缓冲区FIFO->消费者的解耦设计,因为这不是一个生产者和一个消费者。而是有多对多并存的。
线程中需要配合pthread_mutex_t 和 pthread_cond_t使用。


image.png

二,参考blog

线程池原理及C语言实现线程池
pthread_mutex_t 和 pthread_cond_t 配合使用的简要分析
linux生产者消费者模型---线程池的实现实现

三,二叉树与红黑树

二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。二叉树存储方式用链表,常用的遍历次序前序遍历,中序遍历,后序遍历。采用归递来遍历比较容易。

typedef struct BiTNode{
    TElemType data;//数据
    struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode, *BiTree;
image.png

红黑树的遍历和二叉树一样。为什么都喜欢用红黑树?因为查找的效率高。


image.png

关于红黑树的插入按照其公式有左左,右右,左右,右左等情况,然后操作方法为左旋和右旋。
红黑树的规则如下
1.。每个节点都有红色或黑色
2。树的根始终是黑色的
3。没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
4。从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点。

关于红黑树的定理及数学证明我就不看了,感觉跑题太多了。真的要用再深入了解。

四,参考网址

1.红黑树,超强动静图详解,简单易懂
2.25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?
3.为什么红黑树的效率比较高
4.数组、链表、二叉树、二叉排序树、红黑树时间复杂度

你可能感兴趣的:(线程池及红黑树复习--Apple的学习笔记)