【Linux】使用<信号量>实现<线程互斥>(思维导图&代码演示&思路解析)

前言

大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

引言:我们常规用< 互斥量(mutex)>可以实现线程互斥,还有另一种方式即< 信号量 >

一.信号量的概念与语法

1.信号量基本概念&类型&头文件

信号量可以根据其取值范围和用途进行分类,常见的类型包括:

  1. 整型信号量:信号量的值是整数,可以表示任意数量的资源。
  2. 记录型信号量: 除了包含一个整数值(表示可用资源的数量)外,还包含一个进程等待队列,用于存储阻塞在该信号量的各个进程的标识。
  3. 二进制信号量: 只允许信号量取0或1值。这种信号量通常用于实现互斥锁,保证只有一个进程或线程可以访问共享资源。
  • sem_t类型:
  1. 是POSIX线程库提供的一个 信号量类型
  2. sem_t类型的信号量可以模拟上述三类分类中的某些行为
sem_t s;//先定义,后面再初始化

头文件:

semaphore.h

基本概念:

  • 信号量: 表示可用资源的数量
  • 当进程或线程需要访问某个共享资源时,会先尝试获取信号量。如果信号量的值大于0,表示有资源可用,进程或线程可以获取信号量并访问资源,同时信号量的值会减1。如果信号量的值为0,表示没有资源可用,此时进程或线程会进入阻塞状态,等待其他进程或线程释放信号量

2.信号量的基本操作【等待(P操作)& 释放(V操作)】

信号量的操作通常包括两种:等待(P操作)和释放(V操作)。

  • 等待(P操作):【Park】 进程或线程 尝试获取 信号量。
    如果信号量的值大于0,则获取成功,信号量的值减1;
    如果信号量的值为0,则进程或线程进入阻塞状态 ,等待其他进程或线程释放信号量。
  • 释放(V操作):【Voke】 进程或线程 释放 之前获取的信号量。
    释放信号量时,该信号量的值会增加1。
    如果有进程或线程因为信号量的值为0而处于阻塞状态,此时会唤醒一个或多个阻塞的进程或线程。

3.信号量的基本函数【创建&销毁&等待(P操作)& 释放(V操作)】

semm_init(信号量.0,设置的信号量的初值);//创建信号量
sem_destroy(信号量);//销毁毁信号量
sem_wait(信号量);//等待P 操作
sem_pos(信号量)://释放V 操作

二.信号量实现线程互斥(用信号量实现两个线程互斥输出1-10数字)

要求:用信号量实现两个线程互斥输出1-10数字

解析:

  1. 把信号量初始化成1,表示目前可用资源为1
  2. 进入两个线程,其中第一个线程进入等待(P操作)后, 信号量-1变成0
  3. 第二个线程进入进入等待(P操作)后, 由于信号量变为0进入阻塞状态
  4. 第二个线程必须等到第一个线程执行完程序后, 进行释放V操作,释放信号量,信号量+1后,他才会解除阻塞状态
  5. 从而实现互斥操作,2个线程按照先后顺序

流程示意图:
在这里插入图片描述

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>

sem_t s;//定义信号量
void* fun(void* param){
    
    
      long tnum=(long)param;
      int i;
      
      sem_wait(&s);//等待(P操作)park
     

      for(i=1;i<=10;i++){
    
    
         printf("thread%ld:%d \n",tnum,i);
         sleep(1);
      }
     
     sem_post(&s);//释放(V操作)voke
     
int main(){
    
    
     pthread_t tidi,tid2;
     sem_init(&s,0,1);//初始化成1

     pthread_create(&tid1,0,fun,(void*)0);
     pthread_create(&tid2,0,fun,(void*)1);
     pthread_join(tid1,0);
     pthread_join(tid2,0);
     
     sem_destroy(&s);

return 0;

猜你喜欢

转载自blog.csdn.net/YYDsis/article/details/143236143