前言
大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
- YY的《C++》专栏
- YY的《C++11》专栏
- YY的《Linux》专栏
- YY的《数据结构》专栏
- YY的《C语言基础》专栏
- YY的《初学者易错点》专栏
- YY的《小小知识点》专栏
- YY的《单片机期末速过》专栏
- YY的《C++期末速过》专栏
- YY的《单片机》专栏
- YY的《STM32》专栏
- YY的《数据库》专栏
- YY的《数据库原理》专栏
目录
- 一.信号量的概念与语法
- 1.信号量基本概念&类型&头文件
- 2.信号量的基本操作【等待(P操作)& 释放(V操作)】
- 3.信号量的基本函数【创建&销毁&等待(P操作)& 释放(V操作)】
- 二.信号量实现线程互斥(用信号量实现两个线程互斥输出1-10数字)
引言:我们常规用< 互斥量(mutex)>可以实现线程互斥,还有另一种方式即< 信号量 >
一.信号量的概念与语法
1.信号量基本概念&类型&头文件
信号量可以根据其取值范围和用途进行分类,常见的类型包括:
- 整型信号量:信号量的值是整数,可以表示任意数量的资源。
- 记录型信号量: 除了包含一个整数值(表示可用资源的数量)外,还包含一个进程等待队列,用于存储阻塞在该信号量的各个进程的标识。
- 二进制信号量: 只允许信号量取0或1值。这种信号量通常用于实现互斥锁,保证只有一个进程或线程可以访问共享资源。
- sem_t类型:
- 是POSIX线程库提供的一个 信号量类型
- 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
- 进入两个线程,其中第一个线程进入等待(P操作)后, 信号量-1变成0
- 第二个线程进入进入等待(P操作)后, 由于信号量变为0进入阻塞状态
- 第二个线程必须等到第一个线程执行完程序后, 进行释放V操作,释放信号量,信号量+1后,他才会解除阻塞状态
- 从而实现互斥操作,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操作)parkfor(i=1;i<=10;i++){printf("thread%ld:%d \n",tnum,i);sleep(1);}sem_post(&s);//释放(V操作)vokeint main(){pthread_t tidi,tid2;sem_init(&s,0,1);//初始化成1pthread_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;