Linux--多线程(3)
创始人
2024-05-28 16:55:38
0

目录

    • 1. POSIX信号量
      • 1.1 概念
    • 2. 基于环形队列的生产消费者模型
      • 2.1 环形队列的基本原理
      • 2.2 基本实现思想
    • 3. 多生产多消费

1. POSIX信号量

1.1 概念

信号量本质是一个计数器,申请了信号量以后,可以达到预定临界资源的效果。

POSIX信号量和SystemV信号量相同,都可以用于同步操作,达到无冲突访问共享资源的目的。但POSIX可以用于线程间同步。

在未加锁情况下,如果多个线程同时对临界资源进行访问操作,是极度不安全的,所以想要实现多个线程并发,需要有信号量的申请。

每个线程申请了信号量以后,相当于对一块临界资源进行了预定,并且将其分成一个个小资源,每个线程同时访问该临界资源不同区域,达到多线程并发的效果。

对于每个线程来说,想访问临界资源。都必须先申请信号量资源,这就涉及到了信号量的数目多少。

  • P、V操作

这个过程其实就是对信号量进行加加减减。申请信号量的过程有成功或者失败,成功就是count–,失败就是挂起等待,即P操作;释放信号量就是count++,即V操作。

  • PV操作的原子性实现

PV操作的原子性其实是对于其他PV操作而言的,即一个P或V操作不能被其他的PV操作给打断,即需要实现PV操作的互斥。那么我们可以把PV操作的代码当成临界区,保证只有一个进程能访问临界区即可。实现对临界区资源的互斥访问的方法有很多种,比如Peterson算法,禁用中断,加锁等等等

  • 信号量的优缺点

优点:简单,表达能力强,用PV操作可以解决多种类型的同步/互斥问题
缺点:不够安全,PV操作使用不当容易产生死锁,遇到复杂同步互斥问题实现复杂

  • 初始化信号量:

在这里插入图片描述

参数:

pshared:0表示线程间共享,非零表示进程间共享
value:期望申请的信号量初始值

  • 销毁信号量:

在这里插入图片描述

  • 等待信号量:

功能:等待信号量,会将信号量的值减1

在这里插入图片描述

这其实是申请信号量的函数:

是经典的P操作,在申请信号量的过程中有重要作用。

  • 发布信号量:

功能:发布信号量,表示资源使用完毕,可以归还资源了,将信号量值加1

在这里插入图片描述

这个便是V操作,和V操作形成对比。

2. 基于环形队列的生产消费者模型

2.1 环形队列的基本原理

多线程的情况下,实现一个基于环形队列的生产消费模型,来进行环形队列的并发访问。

  1. 生产者和消费者开始的时候,指向的就是同一个位置;在队列为满的时候,也指向同一个位置。
  2. 队列为空的时候,应该让生产者先访问;队列为满的时候,应该让消费者先访问。

所以,当队列既不为空又不为满的时候,生产者和消费者一定指向的不是同一个位置。

那么我们就可以利用这个原理,在生产者和消费者不处于同一位置,那么久说明多个执行流访问的是临界资源的不同区域,就可以实现并发。 但是这个工作是程序员本身完成的,而不是信号量设置好的。

2.2 基本实现思想

对于生产者来说,最关心的资源应该是环形队列中空的位置;对于消费者来说,最关心的资源应该是环形队列中有数据的位置,其实就是资源存在的位置。

在这个模型中,要遵守几个规则:

  1. 生产者不能把消费者套一个圈,也就是说最多生产一圈,消费者就要行动了。

  2. 消费者不能超过生产者

  3. 当指向同一个位置的时候,要根据空、满的状态来判定谁先执行

  4. 除此之外,生产和消费可以并发执行

对于生产者来说,我们申请格子资源,格子资源变少了,其实就是对格子资源做P操作,那么可以放的数据资源更多了,那此时也就相当于对数据资源做V操作;消费者同理。

所以可以通过释放对方资源的方式来达到数据交互的效果。

3. 多生产多消费

如果想实现多生产者和多消费者同时工作,是必须要加锁的,而这个加锁的地方,是放在P操作之后。

生产者函数如下(消费者函数同理):

void PutData(const int &data)
{sem_wait(&space_sem); // Ppthread_mutex_lock(&_mtx_);//加锁q[consume_step] = data;consume_step++;consume_step %= cap;pthread_mutex_unlock(&_mtx_);//解锁sem_post(&data_sem); //V
}

举个例子:如果想要实现并发,如果将锁放在了P操作之前,就会造成PV操作之前都必须要申请到锁的情况,这其实和单线程没有区别,并且申请到了锁以后,PV操作如果不成功,还是需要从新来申请锁,所以效率也会更慢。

而放在P操作之后,可以理解为在申请锁之前,多个线程就已经申请到了信号量,即PV操作是成功的。那么此时只需要等待竞争锁就行了。

而这里正是多生产多消费的优势,每次都只能一个线程生产,一个线程消费,可以并发地获取和处理任务。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...