linux多线程求和_linux多线程pthread系列函数详解

linux多线程pthread系列函数详解

(一)为什么要引入线程

线程技术早在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类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python独立log示例_带有Python示例的math.log()方法

python独立log示例Python math.log()方法 (Python math.log() method) math.log() method is a library method of math module, it is used to get the natural logarithm of a given number to base e (by default). It accepts the number and a base (which an optional) a…

搭建云计算机win10,win10电脑做云服务器

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情Windows远…

聚类分析在用户行为中的实例_用户关注行为数据分析过程详解-描述统计+聚类...

以下是基于一小段用户关注产品的行为数据分析过程详细描述,各位老师如有不同意见或优化建议,还请不吝赐教。一、数据大致是这样的(已经脱敏处理)二、数据预处理从年款提取出年限,从价格标识出价格区间,随便写一下SQL如下&#xff…

centos下升级jdk版本

2019独角兽企业重金招聘Python工程师标准>>> 由于安装的centos系统,自带了jdk1.6和1.7的版本,介于在平时开发,用了1.8.为了保持开发环境的一致,故此需要升级,放办maven打包等工具的使用。 查看系统的jdk版本…

学英语要用计算机吗,学计算机的人是否要学英语?

我记得在我大一的时候,那个时候还没有程序课呢.不过我是很喜欢计算机这个专业的,我也非常想学习编程语言,所以当时即使没有程序课,我也是借了一本VB的书回家来看.当时就在VB的贴吧乱看,大概贴吧里有一个人气很高的一位高手,写了好多文章,也帮人解决好多问题.在他的观点中,他认为…

语言之输出png图片_什么是PPML?如何输出PPML文档?

什么是PPML?PPML是由PODi联盟的几个会员公司共同开发出一种个性化印刷标识语言,这是一种全新的、基于XML(可扩展标识语言)技术的印刷行业标准语言,得到越来越多的业内人士关注。PPML采用XML作为句法基础,使PPML其他很多…

TCP/IP协议网络模型

1.tcp/ip分层模型 tcp/ip把网络结构分为四层,从上到下依次为:应用层、传输层、互联网层、网络接口层。每层担任不同的职责,下层服务于上层,最终上层就是用户使用的层。分层结构如图1所示。 图1 tcp/ip分层模型 (1)应用层 向用户提…

c++中函数atan_atan()函数以及C ++中的示例

c中函数atanC atan()函数 (C atan() function) atan() function is a library function of cmath header, it is used to find the principal value of the arc tangent of the given number, it accepts a number (x) and returns the principal value of the arc tangent of…

我想成为计算机专业第一,我对计算机专业学生的忠告。

计算机专业的学生在面临毕业的时候有些同学应该会有这样的想法,我对计算机没有兴趣,毕业不打算从事计算机专业的对口工作;或者我当时选择学计算机专业是因为那时候对计算机有比较大的兴趣,而现在,越来越觉得没有意思了…

job每分钟执行 oracle_Oracle Job 每个时间点执行示例

1:每分钟执行Interval > TRUNC(sysdate,mi) 1/ (24*60)或Interval > sysdate1/14402:每天定时执行例如:每天的凌晨1点执行Interval > TRUNC(sysdate) 1 1/ (24)3:每周定时执行例如:每周一凌晨1点执行Interval >TRUNC(next_day(sysdate,星期…

c#打印程序原码_C#程序打印新行

c#打印程序原码C#打印新行 (C# printing a new line) To print a new line within the message while printing it on the console, we can use following methods, 要在控制台上打印消息时在消息中打印新行,我们可以使用以下方法, Using \n…

TMCache

TMCache设计的目的是用于存储临时持久化对象的开源iOS/OS key/value缓存类库,减少重复创建像下载数据、缓慢的处理结果这样的昂贵性能花销。TMCache由两个本身相似的存储组成,一个是TMMemoryCache,存在于内存中,另外一个是TMDisk…

oracle 增量_【干货分享】DMETL中的增量抽取初识

DMETL实现了增量数据的同步。在源表上进行的增删改操作,可以通过增量数据抽取,同步到目的表中。在第一次将源表数据全量抽取到目的表中后,可以通过重复地执行增量数据抽取,将源表上的增删改操作产生的变化数据,无遗漏地…

python中ord函数_ord()函数以及Python中的示例

python中ord函数Python ord()函数 (Python ord() function) ord() function is a library function in Python, it is used to get number value from given character value, it accepts a character and returns an integer i.e. it is used to convert a character to an in…

364. Nested List Weight SumII

题目:Given a nested list of integers, return the sum of all integers in the list weighted by their depth. Each element is either an integer, or a list -- whose elements may also be integers or other lists. Different from the previous question wh…

计算机英语论文摘要,求英语高手翻译论文摘要,非常感谢!

彭洁回答:Thispaperdescribesacomputerlinecuttingtechnologyandcomputeranimationtechnology.Computertechnologyiscuttingwillbedesignatedasagraphicswindowborder,fromalargescreentoextracttherequiredspecificinformation,toshowapartialpictureorView.Comput…

python 示例_在Python中带有示例的while关键字

python 示例关键字的Python (Python for keyword) while is a keyword (case-sensitive) in python, it is used to create a while loop. while是python中的一个关键字(区分大小写),用于创建while循环。 Syntax of while keyword while关键字的语法 while condit…

向量表示 运动抛物线_初学讲义之高中物理(四)常见运动类型

本章主要介绍几种较为常见的运动模型以及处理思路一、抛物运动抛物运动是一种较为简单的运动模型,在现实生活中非常常见,比如向空中抛球、向河里丢石子,等等。根据抛出方向的不同,抛物运动可以分为竖抛运动、平抛运动和斜抛运动。…

[Array]Majority Element

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times. You may assume that the array is non-empty and the majority element always exist in the array. 方法:充分利用主元素出…

python true_True关键字,带Python示例

python truePython True关键字 (Python True keyword) True is a keyword (case-sensitive) in python, it is a Boolean value (a value of class type bool). True is the result of a comparison operation. True是python中的关键字(区分大小写),它是一个布尔值(…