Linux线程-POSIX信号量与锁以及条件变量

news2025/4/16 13:47:16

POSIX信号量

POSIX没有元素这个概念相比于SYSTEM-V更简洁,POSIX不一定适用老版本;二者都是系统范畴,都需要手动删除,POSIX相关函数属于线程库,所有编译时需要末尾加上-lpthread选项

POSIX

  • POSIX有名信号量

    1. 主要用于进程间通信

    2. 创建成功后,器特殊文件存放路径:/dev/shm/

  • POSIX无名信号量(属于进程间,随着进程的消亡而消失)

    1. 主要用于线程间通信

//无名信号量用于线程间同步和互斥
#include "head.h"

sem_t data;
sem_t space;

void* routine(void* arg)
{
    char* num = (char*)arg;
    
    while(1)
    {
        sem_wait(&data);
        
        printf("routine: %s\n", num);
        
        sem_post(&space);
    }
}

int main()
{
    char str[100];
    
    // 第一个参数:创建成功后返回的信号量标识符
    // 第二参数:  0代表线程间通信
    // 第三个参数:当前信号量的初始值
    sem_init(&data, 0, 0);
    sem_init(&space, 0, 1);
    
    pthread_t tid;
    pthread_create(&tid, NULL, routine, str);
    
    while(1)
    {
        sem_wait(&space);
        
        bzero(str, sizeof(str));
        fgets(str, sizeof(str), stdin);
        
        sem_wait(&data);
    }
    
    return 0;
}

锁与条件变量

//用于验证互斥锁读写锁与条件变量(用于解决互斥锁的死锁问题)

// 定义一个共享资源,通过条件变量控制访问
int balance = 0;
// 条件变量通常需要结合互斥锁使用
pthread_mutex_t m;
// 条件变量是用于解决互斥锁使用过程中可能出现的死锁
pthread_cond_t v;

//线程函数 -- 相当于兄弟姐妹
void* routine(void* arg)
{
    //对共享资源访问时需要加锁、解锁操作
    pthread_mutex_lock(&m);
    
    while(balance < 100)
    {
        // 卡里没钱则进入条件等待队列,进入队列时,条件变量会自动执行解锁操作,这是条件变量底层已经封装好了,无需手动操作
        pthread_cond_wait( &v, &m);
    }
    
    fprintf(stderr, "[%lu]:取钱之前的金额:%d\n", pthread_self(), balance);
    balance -= 100;
    
    pthread_mutex_unlock(&m);
    
    pthread_exit(NULL);
}

// ./a.out 10
int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        printf("未输入线程数量\n");
        return -1;
    }
    
    // 1、初始化互斥锁和条件变量
    pthread_mutex_init(&m, NULL);
    pthread_cond_init(&v, NULL);
    
    // 2、创建线程
    pthread_t tid;
    int nThread_num = atoi(argv[1]);
    for(int i = 0; i < nThread_num; i++)
    {
        //创建多个兄弟姐妹
        pthread_create(&tid, NULL, routine, NULL);
    }
    
    // 3、让当前主线程给balance增值
    int i = nThread_num
    while(i--)
    {
        //对共享资源访问时需要加锁、解锁操作
        pthread_mutex_lock(&m);
        // 相当于家长汇钱
        balance += 100;
        // 向条件等待队列发送通知,汇钱后通知兄弟姐妹
        pthread_cond_broadcast(&v);
        
        pthread_mutex_unlock(&m);
        
        sleep(2);//为了便于查看条件等待队列的过程
    }
    //退出主线程
    pthread_exit(NULL);
    //退出进程
    //return 0;
}

可重入函数

一个函数如果同时被多个线程调用,返回的结果都是严格一致的,那么就是可重入函数,否则就是不可重入函数。

例如:排序函数是可重入函数,取地址函数是不可重入函数

多个线程调用同一可重入函数出现不同结果原因:

1、函数内部使用了共享资源,如全局变量

2、函数内部调用了其他不可重入函数

3、函数执行结果与硬件设备相关

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

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

相关文章

华为 HCIP-Datacom H12-821 题库 (29)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.BFD 为确保两端系统都知道状态的变化&#xff0c;在BFD 状态机的建立和拆除时都采用三次握手…

【LeetCode:75. 颜色分类 + 快速排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

图像超分辨率(SR)

图像超分辨率&#xff08;Image Super-Resolution, SR&#xff09;是一种图像处理技术&#xff0c;旨在从低分辨率&#xff08;LR&#xff09;图像中恢复出高分辨率&#xff08;HR&#xff09;图像。这种技术通过增加图像中的细节和清晰度来提高图像的视觉质量&#xff0c;从而…

微信支付准备工作之内网穿透2024/9/28

微信支付部分好像做不了&#xff0c;但是跟着写了点东西。 做项目的微信支付功能时&#xff0c;微信后台需要调用到商户管理系统&#xff0c;但是我们的管理系统写在自己的电脑里。微信后台如何调用到商户系统&#xff1f;内网穿透。 还有如何保证调用过程数据安全&#xff1…

PowerDesigner 16.5安装教程 + 轻松解决软件证书过期导致的无法使用问题

目录 背景: 安装教程 &#xff1a; 证书过期的解决方法&#xff1a; 背景: PowerDesigner16.5凭借强大的功能集成、广泛的兼容性和高效的模型驱动开发方法成为了企业级建模于设计领域的佼佼者。无论是在企业信息化建设、软件开发项目还是数据库设计于管理等领域它都能提有利…

【步联科技身份证】 身份证读取与解析———未来之窗行业应用跨平台架构

一、身份证解析代码 C# function 身份证数据解析_湖南步联科技(wzxx) {var result {};result[xm] wzxx.substr(0, 15);result[xbdm] wzxx.substr(15, 1);result[mzdm] wzxx.substr(16, 2);result[csrq] wzxx.substr(18, 8);result[dzmc] wzxx.substr(26, 35);result[gms…

论文阅读 | HiDDeN网络架构

ECCV 2018 斯坦福-李飞飞团队 一、问题描述 受以下启发&#xff1a; 对抗性例子的发现&#xff1a;深度学习模型在图像识别任务中对微小的、难以察觉的输入扰动非常敏感&#xff0c;这些扰动可以导致模型错误分类图像。这一现象表明&#xff0c;神经网络可以在图像中编码信息&…

一文上手SpringSecurity【五】

对于前后端不分离的项目,我们可以采用一文上手SpringSecurity【四】当中的方式来自定义用户的登录页面和数据源,数据源目前采用的是模拟的方式来实现的,本篇内容主要介绍一下spring security对于前后端分离项目如何实现认证和授权的. 一、前后端分离的认证面对的问题 1.1 传统…

File systems

inode descriptor 文件系统中核心的数据结构就是inode和file descriptor。后者主要与用户进程进行交互。 inode&#xff0c;这是代表一个文件的对象&#xff0c;并且它不依赖于文件名。实际上&#xff0c;inode是通过自身的编号来进行区分的&#xff0c;这里的编号就是个整数…

修改 idea 的 Terminal 命令窗口使用 git-bash

修改配置方法 实际使用效果 &#xff08;END&#xff09;

Java Stream 神技!10招顶级技巧,让你的代码简洁又高效!

哈喽&#xff0c;欢迎来到【程序视点】&#xff0c;我是小二哥。 引言 你是否曾在编写Java代码时&#xff0c;为了处理集合而感到头痛不已&#xff1f;是否在寻找一种更优雅、更简洁的方式来简化你的代码&#xff1f; 如果你的答案是肯定的&#xff0c;那么Java Stream API无…

org.eclipse.paho.client.mqttv3.MqttException: 无效客户机标识

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…

OpenCV视频I/O(6)检查视频捕获对象是否已成功打开的函数isOpened()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果视频捕获已经初始化&#xff0c;则返回 true。 如果之前调用 VideoCapture 构造函数或 VideoCapture::open() 成功&#xff0c;则该方法返回…

ireport 5.1 中文生辟字显示不出来,生成PDF报字体找不到

问题&#xff1a; 情况1&#xff1a;ireport中填入中文生辟字的时候不显示&#xff0c;或者无法输入和粘贴生辟字。 情况2&#xff1a;生成pdf的时候报字体找不到。 net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font : pdfFontName : …

十分钟实现内网连接,配置frp

十分钟实现内网连接&#xff0c;配置frp 一.frp是什么&#xff1f;其实是一款实现外网连接内网的一个工具&#xff0c;个人理解&#xff0c;说白了就像是teamviwer一样&#xff0c;外网能访问内网。 利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服…

Python神经求解器去耦合算法和瓦瑟斯坦距离量化评估

&#x1f3af;要点 神经求解器求解对偶方程&#xff0c;并学习两个空间之间的单调变换&#xff0c;最小化它们之间的瓦瑟斯坦距离。使用概率密度函数解析计算&#xff0c;神经求解器去耦合条件正则化流使用变量变换公式的生成模型瓦瑟斯坦距离量化评估神经求解器 &#x1f36…

CSS06-元素显示模式、单行文字垂直居中

一、什么是元素显示模式 1-1、块级元素 1-2、行内元素 1-3、行内块元素 1-4、小结 二、元素显示模式转换 三、单行文字垂直居中 CSS 没有给我们提供文字垂直居中的代码&#xff0c;这里我们可以使用一个小技巧来实现。 解决方案: 让文字的行高等于盒子的高度&#xff0c;就可…

普通二叉搜索树的模拟实现【C++】

二叉搜素树简单介绍 二叉搜索树又称二叉排序树&#xff0c;是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 注意…

C++深入学习string类成员函数(4):字符串的操作

引言 在c中&#xff0c;std::string提供了许多字符串操作符函数&#xff0c;让我们能够秦松驾驭文本数据&#xff0c;而与此同时&#xff0c;非成员函数的重载更是为string类增添了别样的魅力&#xff0c;输入输出流的重载让我们像处理基本类型的数据一样方便地读取和输出字符…

51单片机系列-串口(UART)通信技术

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式&#xff1a;数据的各位用多条数据线同时发送或者同时接收 并行通信特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xf…