Linux线程:信号量

news2024/9/30 17:25:49

1. 信号量

(1)概念

信号量是非负整数计数器,表示当前可使用的公共资源的个数;主要用于进程或线程的同步或互斥。

信号量 > 0,则可访问公共资源,信号量;信号量 < 0,则阻塞。

(2)PV操作

对信号量的操作。P是信号量+1,V使信号量-1.


2. 信号量相关函数

(1)信号量的初始化、销毁

#include<semaphore.h>

int sem_init(sem_t* sem, int pshared, unsigned int value);
/*
功能:
    用value初始化信号量sem的初始值
参数:
    sem:信号量地址
    pshared:
        0:信号量在线程间共享;
        非0:信号量中进程间共享;
    value:信号量的初始值
返回值:
    成功:0
    失败:-1   
*/

int sem_destroy(sem_t* sem);
/*
功能:
    销毁信号量sem
参数:
    sem:信号量地址
返回值:
    成功:0
    失败:-1
*/

(2)信号量P操作(-1)

#include<semaphore.h>

int sem_wait(sem_t* sem);
/*
功能:
    将信号量sem减1。若信号量 = 0,则阻塞,直至信号量 > 0,进行减1操作。
参数:
    sem:信号量地址。
返回值:
    成功:0
    失败:-1
*/

int sem_trywait(sem_t* sem);
/*
功能:
    以非阻塞方式对信号量减1操作。
返回值:
    若信号量 > 0, 则减1,并返回0;
    若信号量 = 0,则直接返回-1,并将errno设置为EAGAIN
*/

int sem_timedwait(sem_t* sem,  const struct timespec* abs_timeout);
/*
功能:
    限时abs_timeout对信号量减1操作。
返回值:
    abs_timeout内信号量 > 0,则减1,并返回0。
    超时则返回-1,并将errno设置为ETIMEDOUT。
*/

(3)信号量V操作(+1)

#include<semaphore.h>

int sem_post(sem_t* sem);
/*
功能:
    将信号量+1,并唤醒等待的线程。
参数:
    sem:信号量地址。
返回值:
    成功:0
    失败:-1
*/

 (4)获取信号量的值

#include<semaphore.h>

int sem_getvalue(sem_t* sem, int* sval);
/*
功能:
    获取信号量sem的值,保存在sval中。
参数:
    sem:信号量地址;
    sval:保存信号量值的地址;
返回值:
    成功:0
    失败:-1
*/

3. 信号量用于互斥

将之前的打印机程序由互斥锁控制访问改为信号量控制访问。

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

sem_t sem;

void printer(char* str) {
    while (*str != '\0') {
        putchar(*str);
        fflush(stdout); // 刷新输出缓冲区
        str++;
        usleep(1000);
    }
    putchar('\n');
}

void* task1(void* arg) {
    char* str = (char*)arg;
    sem_wait(&sem);  // 使用打印机前P操作
    printer(str);
    sem_post(&sem);  // 使用打印机后V操作
    return NULL;
}

void* task2(void* arg) {
    char* str = (char*)arg;
    sem_wait(&sem);  // 使用打印机前P操作
    printer(str);
    sem_post(&sem);  // 使用打印机后V操作
    return NULL;
}

int main(int argc, const char* argv[]) {

    pthread_t tid1, tid2;

    char* str1 = "Hello";
    char* str2 = "World";

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

    pthread_create(&tid1, NULL, task1, (void*)str1);
    pthread_create(&tid2, NULL, task2, (void*)str2);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

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

    return 0;
}

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dreamer的创作纪念日

先来看看这张图&#xff1a; 创作者dreamer来到CSDN的第1024天 机缘 提示&#xff1a;可以和大家分享最初成为创作者的初心 最初开始写CSDN博客&#xff0c;初衷是为了记录&#xff1a;自己工作或学习中遇到的一些问题&#xff08;就像我的第一篇博客&#xff0c;就是刷Lee…

Windows powershell添加自定义快捷指令(Linux下也有)

Windows Powershell 1.创建并修改Windows Powershell 启动执行文件 echo $PROFILE编辑C:\Users\hongyang.jia\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 2.按照以下格式输入命令 function 别名 { 需要替代的命令 }例如我的Git简写命令 function gs {git sta…

dm5爬虫(selenium)

因为纯requests请求获取不到图片链接,所以用了selenium import requests import os from lxml import etree import re from selenium import webdriverurl https://www.dm5.com/manhua-qiangweishaonv/ # 漫画的url response requests.get(url) # 获取响应 print(response)…

PowerJob客户端连接

本文来说下PowerJob客户端连接 文章目录 启动服务端编写示例代码编写自己的处理器启动示例程序任务配置与运行配置任务创建任务执行结果运行结果问题及解决 本文小结 启动服务端 启动服务端&#xff1a;http://127.0.0.1:7700/#/oms/home 编写示例代码 进入示例工程&#xff08…

RGB-D基准测试工具:绝对轨迹误差 (ATE)、相对位姿误差 (RPE)和从图像生成点云

在估计RGB-D相机轨迹并将其保存到文件中后&#xff0c;我们需要通过将其与地面事实进行比较来评估估计轨迹中的误差。有不同的错误指标。两种突出的方法是绝对轨迹误差&#xff08;ATE&#xff09;和相对姿势误差&#xff08;RPE&#xff09;。ATE非常适合测量可视 SLAM 系统的…

5 map、结构体、方法、面向对象【Go语言教程】

5 map、结构体、方法、面向对象【Go语言教程】 1 map 1.1 概念及声明 ①概念 基本语法&#xff1a;var map 变量名 map[keytype]valuetype key 可以是什么类型&#xff1f; golang 中的 map&#xff0c;的 key 可以是很多种类型&#xff0c;比如 bool, 数字&#xff0c;stri…

OK6410A 中的 irqdomain 之 gpio

文章目录 VIC domain 与 gpio domain 的硬件拓扑语言描述VIC 与 INT_EINTx 的关系INT_EINTx 与 GPIO的关系INT_EINT0INT_EINT1INT_EINT2INT_EINT3INT_EINT4INT_EINT4 与 External interrupt Group1-9 的关系External interrupt Group1External interrupt Group2External interr…

基于Open3D的点云处理2-Open3D的IO与数据转换

三维数据类型 点云 某个坐标系下的点数据集&#xff0c;每个点包括三维坐标X&#xff0c;Y&#xff0c;Z、颜色、分类值、强度值、时间等信息&#xff1b; 储存格式&#xff1a;pts、LAS、PCD、xyz、asc、ply等&#xff1b;Mesh 多边形网格&#xff0c;常见的是三角网格&#…

node快速搭建接口实现登录退出,增删改查功能供前端使用,结尾有完整代码

用node快速搭建接口 环境实现功能具体实现步奏数据库设计用express创建一个服务器实例创建数据库连接池配置跨域请求和解析前端数据登录接口实现验证token的中间件退出接口获取用户信息接口增删改查功能 完整代码 环境 node版本v17.0.0 所用到的依赖 "dependencies"…

量子力学奇妙之旅-从相对论下薛定谔方程到量子场论

专栏目录: 高质量文章导航-持续更新中 1.用于描述一个多粒子体系的波函数 前置:最小的尺度 由于不确定性原理 因此为了测量到更小的空间尺度,我们就需要提高探测粒子的动量

RSA非对称加密(附工具类Util)

文章目录 非对称加密是什么非对称加密通信流程RSA非对称加密算法非对称加密工具类Util及案例演示 之前写过一篇关于DES对称加密的帖子&#xff0c;感兴趣的小伙伴可以去看看&#xff1a;DES对称加密算法 今天主要聊聊什么是非对称加密&#xff0c;以及它是如何实现的。 一、非…

f(x)与|f(x)|,f ‘ (x),F(x)常见关系。

1.f(x)与|f(x)|关系。 1.连续关系。(f(x)在"[a,b]上连续" > |f(x)|在"[a,b]连续") ①如果f(x)在[a,b]上连续。则|f(x)|在[a,b]上连续. &#xff08;因为f(x)在x0的连续点>x0必为|f(x)|的连续点&#xff09; 注&#xff1a;”[a,b]连续“包括&#…

PUBG绝地求生的制作公司计划今年推出NFT元宇宙游戏

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;5分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 近年来&#xff0c;元宇宙的概念在游戏界获得了极大的关注。元宇宙指的是一个虚…

武汉大学惯性导航课程合集【2021年秋】2.1 惯导机械编排算法

Vrb是客观存在的&#xff0c;b相对于r的速度&#xff08;从R到b的变化&#xff09;&#xff0c;右上角的b表示投影到p坐标系&#xff0c;只是表达数值的不同。 &#xff08;工程上5-10&#xff0c;50倍&#xff09;奈奎斯特采样率&#xff0c;香农采样定理&#xff0c;又称奈…

Synthesys:语音合成和视频生成平台

【产品介绍】 Synthesys是一个基于人工智能的语音合成和视频生成平台&#xff0c;可以让你用几分钟的时间&#xff0c;就能制作出专业的音频和视频内容&#xff0c;无需花费大量的金钱和时间去雇佣演员、摄像机或音频设备。Synthesys的技术可以把你的文本转换成逼真的人声和人像…

《花雕学AI》AI时代来临,互联网教父凯文·凯利给你50条生存指南:5000天后的世界会是什么样?

你知道凯文凯利吗&#xff1f;他是《连线》杂志的创始人之一&#xff0c;被誉为“世界互联网教父”&#xff0c;他的预言和观点影响了无数人的思考和行动。他曾经预言过互联网、社交媒体、区块链等技术的发展和变革&#xff0c;而现在&#xff0c;他又给我们带来了一个全新的预…

Vue电商项目--防抖节流应用

演示卡顿现象 正常&#xff1a;事件触发非常频繁&#xff0c;而且每一次的触发&#xff0c;回调函数都要去执行&#xff08;如果时间很短&#xff0c;而回调函数内部有计算&#xff0c;那么很容易出现浏览器卡顿&#xff09; 正常情况下&#xff08;用户慢慢的操作&#xff0…

基于Transformer的DETR的注意力权重可视化,非CAM可视化技术

神经网络的可视化可以客观的解释 “黑盒” &#xff0c;所以一直以来都是论文中必不可少的工作。对于深度卷积神经网络&#xff0c;一般用CAM进行可视化研究。遗憾的是&#xff0c;基于Transformer的神经网络可视化&#xff0c;CAM并不奏效。所以&#xff0c;本文章提供一套基于…

考研机试刷题第二天:任意进制转任意进制【高进度短除法】

理一下思路&#xff1a; 看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。 于是我写出了下面的代码 #include <iostream> #include <vector> #include <algorithm> #include <cstring>using namespace std;vector<…

SpringCloud微服务如何进行权限校验?

一、概述&#xff1a; 1、什么是Spring Cloud&#xff1f; SpringCloud, 基于SpringBoot提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#xff0c;…