完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对于线程而言我们知道,他是存在在我们的进程当中,之前在我们的简单例子当中我们看到一个线程的创建就是在我们的同一个文件当中,那么对于我们的数据传输的话不就是一个全局变量的问题吗,所以对于线程而言,通信是比较容易实现的,但是会出现一些问题,比如说并发执行的时候我们会需要一种机制来保证两者不会冲突,为了避免这种情况,在面对共享资源的使用上面,我们可以使用信号量的方式来保证线程的正常执行。 我们要明白一个就是信号量是一个什么概念,信号量,就是我们会发送一个信号给另外一个对象。这两个对象之间往往是我们的两个进程或者线程之间进行的,要注意这里就是,我们在进程中说的信号量和我们在线程当中说到的信号量,两个是一样的,不加以区分。那么一般信号量一般是用于同步使用的,举个简单的例子就是说我们两者要同步,那么我们一般是怎么样,其中一个人说123开始,然后同时开始做某件事情,那么从进程和线程上面来讲也是这样,一个进程或者线程告诉另外一个线程或者进程一个信号,然后另外那个进程或者线程开始干嘛干嘛,简单来说就是这样一个道理,那么我们看下如何实现吧。 需要包含的头文件: #include 信号量函数原型: int sem_init(sem_t *sem, int pshared, unsigned int value); 该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。pshared控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则信号量就可以在多个进程之间共享,value为sem的初始值。调用成功时返回0,失败返回-1. 下面我们举个例子,实现一个程序实现。 程序的实现功能为主线程中创建子线程,主线程中负责读入字符串,而子线程中负责输出字符串的个数,同时将字符串中小写的字符转换成大写的。
互斥量:互斥量,从字面上看,本身的逻辑关系就是互斥,具体的表现是说,当两个线程同时需要一个资源的时候,是互斥的,也就是说在一个时间点有且只有一个线程可以访问这个资源,那么为了保证说在一个时刻当中不会出现两个线程去抢占这个资源,引入这样的一个东西来解决这个问题。 这里我们总结一下和信号量的区别: 1.信号量是用于同步,而互斥量是用于互斥,要理解这两个的区别 2.互斥量的数值一般是0或者1,而信号量的值可以任意的非负整数,我们在创建的时候可以给定初始值 3.互斥量的加锁和解锁是在同一个线程中实现的,而信号量则是由一个线程释放,另外一个线程得到的。 同样我们引入互斥量实现上面的功能,这里就不是和我们上面的信号量一样的,我们使用信号量的时候是说当我主线程接收完了输入的内容,释放信号量告诉子线程说我们接收完了输入字符,你可以开始统计了,而我们在互斥量这里是说在我们输入和统计的时候进行锁定,这个时候就不能有其他线程进入这个操作,保证buf在一个时间内只有一个线程进行操作。 注意: 这部分的参考API是不包含在默认的man手册中的,我们需要去额外安装相应的man手册才可以,具体的安装命令如下:(适用于mint/ubuntu) sudo apt-get install manpages-posix-dev 创建互斥量使用的函数是: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
最后一个我们看下条件变量。这个也是一个线程同步的一个机制,关于条件变量的使用也稍许麻烦,也同样是和我们的之前谈到的互斥量,或者是信号量是有些类似的思想,一个子线程等待主线程给他发信息,然后他才开始执行。就跟跑步一样,是需要主教练发枪,然后各个选手开始跑,这里的主教练就和我们的主线程一样,而其他的选手就和我们的子线程是一样的。 这里我们暂且不给出条件变量的代码,待补充。 |
|
相关推荐
2 个讨论
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4914 浏览 0 评论
87442 浏览 0 评论
【高手问答】如何做到精通linux威廉希尔官方网站 ?资深工程师带你突破难点
4758 浏览 2 评论
3641 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2494 浏览 0 评论
2045浏览 3评论
1330浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1386浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1254浏览 0评论
1196浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 09:47 , Processed in 1.000176 second(s), Total 42, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号