linux多线程pthread系列函数详解
linux多线程pthread系列函数详解
recv函数(⼀)为什么要引⼊线程
线程技术早在60年代就被提出,但是在80年代才真正使⽤到操作系统中。传统UNIX也⽀持多线程概念,但在⼀个进程中只允许有⼀个线程,这样多线程就意味着多进程。现在多线程技术已经被很多操作系统⽀持,包含Windows/NT,当然也包含Linux。
我们知道新建⽴⼀个进程的代价是⾮常昂贵的,内核需要分配⼀个空间,建⽴众多的数据表来维护他的数据段/代码段等。但是在⼀个进程中的多个线程,使⽤相同的地址空间,共享⼤部分数据,新建⽴⼀个线程花费的时间要远远⼩于新建⼀个进程,⽽且,线程之间的切换速度也远远⼩于进程的切换速度。
另外⼀点是通信的快速,进程由于有独⽴的地址空间,进程的数据传递往往使⽤通信的⽅式。⽽线程共享同⼀个数据空间,多个线程之间只需要做好数据保护,就可以直接使⽤数据,避免拷贝。
线程优点总结以下⼏个⽅⾯:
1)提⾼程序响应速度。⽐如按键响应这种耗时的操作可以在⼀个新建⽴的线程中去做,这样就不会影响其他的程序执⾏。
2)改善程序结构,复杂的逻辑可以按照业务拆分出多个线程处理,程序会利于修改与整理。
3)更好的应⽤于SMP系统,⼀个进程的多个线程可以分配到不同CPU上⾯运⾏。
(⼆)Pthread
Linux下的多线程遵从POSIX线程接⼝,简称pthread,在pthread库中提供。
pthread_create():创建⼀个线程
pthread_exit():退出⼀个线程
pthread_jion():阻塞当前线程,直到另⼀个线程执⾏结束
pthread_attr_init():设置线程是否脱离属性
pthread_kill():给线程发送kill信号
同步函数:
pthread_mutex_lock():互斥加锁
pthread_mutex_unlock():互斥锁解锁
pthread_cond_init():初始化条件变量
pthread_cond_signal():发送信号唤醒进程
pthread_cond_wait():等待条件变量的特殊事件发⽣
(三)pthread互斥锁的实现原理
pthread_create线程的创建:
最初的进程包含程序/资源/执⾏三部分,程序就是代码,资源主要包含系统层⾯上的内存/IO/信号资源等,⽽执⾏就是指执⾏上下⽂,包含代码对CPU的使⽤。后来设计者逐渐修正了进程的概念,允许资源不被进程严格独占,允许某些进程共享⼀部分资源⽐如信号/⽂件/数据内存/甚⾄代码。这就逐渐发展出轻量进程的概念,Linux2.4就已经实现了轻量进程的概念,通过调⽤clone的系统调⽤,设置不同的参数来设置是普通进程还是轻量级进程。clone最终调⽤do_fork函数,不同的clone_flag使do_fork有不同的⾏为:
LinuxThread使⽤(CLONE_VM|CLONE_FS|CLONE_FILES|CLONESIGHAND)调⽤clone函数,表明创建的新进程为共享内存/共享⽂件系统访问计数/共享⽂件描述符表/共享信号处理⽅式的意思。
LinuxThreads就是实现基于核⼼轻量级进程的“⼀对⼀”线程模型,⼀个线程实体对应⼀个核⼼轻量级进程,⽽线程之间的管理在核外函数库中实现。“⼀对⼀”模型的好处是线程的调度由核⼼完成,⽽其他诸如线程取消/线程间同步等⼯作都是在核⼼外的线程库中做的,在LinuxThreads中,专门为每个进程构造了⼀个管理线程,负责处理线程相关的管理⼯作。
pthread_mutex_lock互斥锁原理:
pthread_mutex_lock属于sleepwaiting类型的锁。Linux上的mutex互斥锁都是futex类型的锁。
futex(fast usermode mutex)快速⽤户去互斥锁的检查,futex时候由⽤户空间的⼀个对齐的整形变量和附在其上的内核空间的等待队列构成。这种锁的思想是,当锁没有竞争时,对位于⽤户空间的futex的整形变量进程操作(汇编语⾔调⽤CPU提供的原⼦操作来增加或减少它),当锁有竞争时,则通过内核态调⽤,将竞争失败的进程放⼊等待队列,并唤醒竞争成功的进程到就绪队列来是吸纳
(四)pthread在项⽬中的使⽤
在处理数据流的项⽬中,DevCapture是抓取视频流的类,注册硬件产⽣的视频流,⼀个DevCapture就是继承⼀个线
程,CRecord/CStreamSend等类将数据处理函数注册到DevCapture中,由DevCapture的线程执⾏体调
⽤各个注册的处理函数。
整个项⽬的关键处理程序在⼀个进程中,不同通道的流和具体线程的分配我不确定对应的策略。
数据流的发送处理在DevCapture中,没有经过数据拷贝。
接收是通过系统的协议栈获取上来的数据,必然由独⽴的线程recv,进⾏数据拼接,并模拟出⼀个类似DevCapture的ICapture类。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。