0

0

【Linux】使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

看不見的法師

看不見的法師

发布时间:2025-06-26 11:16:21

|

981人浏览过

|

来源于php中文网

原创

【linux】使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

一.信号量的概念与语法

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

整型信号量:信号量的值为整数,用于表示任意数量的资源。

记录型信号量:除了包含一个整数值(表示可用资源的数量)外,还包含一个进程等待队列,用于存储阻塞在该信号量的各个进程的标识。

二进制信号量:仅允许信号量取0或1值。这种信号量通常用于实现互斥锁,保证只有一个进程或线程可以访问共享资源。

sem_t类型:是POSIX线程库提供的一个信号量类型。sem_t类型的信号量可以模拟上述三类分类中的某些行为。

sem_t s; // 先定义,后面再初始化
semaphore.h

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

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

等待(P操作):【Park】 进程或线程尝试获取信号量。如果信号量的值大于0,则获取成功,信号量的值减1;如果信号量的值为0,则进程或线程进入阻塞状态,等待其他进程或线程释放信号量。

美图云修
美图云修

商业级AI影像处理工具

下载

释放(V操作):【Voke】 进程或线程释放之前获取的信号量。释放信号量时,该信号量的值会增加1。如果有进程或线程因为信号量的值为0而处于阻塞状态,此时会唤醒一个或多个阻塞的进程或线程。

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

sem_init(&信号量, 0, 信号量的初值); // 创建信号量
sem_destroy(&信号量); // 销毁信号量
sem_wait(&信号量); // 等待P操作
sem_post(&信号量); // 释放V操作

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

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

#include 
#include 
#include 
#include 

sem_t s; // 定义信号量

void fun(void param) { long tnum = (long)param; int i;

sem_wait(&s); // 等待(P操作)park
for(i=1; izuojiankuohaophpcn=10; i++) {
    printf("Thread %ld: %d\n", tnum, i);
    usleep(100000); // 延迟100毫秒
}
sem_post(&s); // 释放(V操作)voke

return NULL;

}

int main() { pthread_t t1, t2;

sem_init(&s, 0, 1); // 初始化信号量为1

pthread_create(&t1, NULL, fun, (void*)1);
pthread_create(&t2, NULL, fun, (void*)2);

pthread_join(t1, NULL);
pthread_join(t2, NULL);

sem_destroy(&s); // 销毁信号量

return 0;

}

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

703

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

0

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 6.3万人学习

Node.js 教程
Node.js 教程

共57课时 | 8.9万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号