Linux 中 POSIX 互斥信号量(互斥锁)的使用

news2024/11/29 2:51:48

目录

  • 一、互斥锁的介绍
  • 二、使用方法
  • 三、测试代码

一、互斥锁的介绍

  在Linux系统中,特别是在ARM架构的嵌入式系统中,互斥量(Mutex)用于保护共享资源不被多个线程或任务同时访问,从而防止数据竞争和不一致性。
POSIX 互斥信号量的类型为 pthread_mutex_t。使用时需要定义一个 pthread_mutex_t 类型的变量,如:

pthread_mutex_t mutex;

二、使用方法

  互斥量是一个对象,它可以被锁定(locked)和解锁(unlocked)。当一个线程或任务锁定了一个互斥量时,其他任何试图锁定该互斥量的线程或任务都将被阻塞,直到该互斥量被解锁。
①初始化:在使用互斥量之前,必须对其进行初始化。这通常是通过调用一个特定的函数(如pthread_mutex_init)来完成的。
②锁定与解锁:当线程或任务需要访问共享资源时,它应该首先锁定互斥量,使用pthread_mutex_lock 函数,如果互斥量已经被另一个线程或任务锁定,则当前线程或任务将被阻塞,直到互斥量被解锁。访问完共享资源后,线程或任务应该解锁互斥量,使用 pthread_mutex_unlock 函数,以便其他线程或任务可以访问它。
③销毁:当不再需要互斥量时,应该销毁它,以释放与之关联的资源。这通常是通过调用一个特定的函数(如pthread_mutex_destroy)来完成的。
④类型:在POSIX线程(pthreads)库中,有两种主要的互斥量类型,分别是正常互斥量(normal mutex)和递归互斥量(recursive mutex)。正常互斥量不允许同一个线程多次锁定它,而递归互斥量则允许。
  一个 POSIX 互斥信号量使用以前必须首先进行初始化,可以把 mutex 初始值设置为PTHREAD_MUTEX_INITIALIZER(静态初始化),也可以调用 pthread_mutex_init 函数进行动态初始化。
  线程如果需要等待一个互斥信号量,可以调用pthread_mutex_lock 函数。释放一个互斥信号量使用 pthread_mutex_unlock 函数。
  当一个互斥信号量使用完毕后,应该调用 pthread_mutex_destroy 函数将其删除。需要注意的是,如果试图再次使用一个被删除的信号量,将出现未知的错误。
在这里插入图片描述

三、测试代码

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
#include <sys/types.h>
#include <unistd.h>

  
// 定义一个全局变量作为共享资源  
int counter = 0;  
  
// 定义一个互斥量用于保护counter  
pthread_mutex_t mutex;  
  
// 无参 线程函数,用于增加counter的值  
/*
void* increment_counter(void* arg) {  

	pid_t		pid;
	pthread_t	tid;
 
	pid = getpid();
	tid = pthread_self();
	

    	for (int i = 0; i < 5; i++) {  
        // 锁定互斥量  
        pthread_mutex_lock(&mutex); 
        
        counter++;  
	printf("pid %lu tid %lu (0x%lx)\n", (unsigned long)pid,(unsigned long)tid, (unsigned long)tid);
	printf("counter = %d\r\n",counter); 
        // 解锁互斥量  
        pthread_mutex_unlock(&mutex);  
    }  
    return NULL;  
}  
*/

// 有参 线程函数,用于增加counter的值
void* increment_counter(void* arg) { 
    int tmp = *(int *)arg; 
    for (int i = 0; i < 5; i++) {  
        // 锁定互斥量  
        pthread_mutex_lock(&mutex); 
        
        counter++;  
	printf("num = %d \r\n",tmp);
	printf("counter = %d \r\n",counter); 
        // 解锁互斥量  
        pthread_mutex_unlock(&mutex);  
    }  
    return NULL;  
} 



  
int main() {  
    // 初始化互斥量  
    pthread_mutex_init(&mutex, NULL);  

  
    // 创建两个线程,每个线程都会增加counter的值  
    pthread_t thread1, thread2;  
    //无参
    //pthread_create(&thread1, NULL, increment_counter, NULL);  
    //pthread_create(&thread2, NULL, increment_counter, NULL);  

    //有参 
    int num1=1;
    int num2=2;

    pthread_create(&thread1, NULL, increment_counter, &num1);  
    pthread_create(&thread2, NULL, increment_counter, &num2);  
  
    // 等待两个线程完成  
    pthread_join(thread1, NULL);  
    pthread_join(thread2, NULL);  
  
    // 打印最终的counter值(应该是10)  
    printf("Final counter value: %d\n", counter);  
  
    // 销毁互斥量  
    pthread_mutex_destroy(&mutex);  
  
    return 0;  
}

测试结果,如下:
在这里插入图片描述

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

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

相关文章

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中&#xff0c;Stream流是Java 8引入的一个重要概念&#xff0c;它提供了一种新的处理集合的方式&#xff0c;可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作&#xff0c;比如过滤、映射、排序、聚合等&#xff0c;同时也支持并行处理&#xf…

Go的安装与配置

安装 https://go.dev/dl/ 以Windows上安装为例&#xff1a; 下一步下一步&#xff0c;记住安装位置 安装完成后 win rcmd 键入go version检查是否安装成功 配置 Go 工作区 Go 在组织项目文件方面与其他编程语言不同。 Go 是在工作区的概念下工作的。但是从版本 1.11 开始&…

Dreamweaver 2021 for Mac 激活版:网页设计工具

在追求卓越的网页设计道路上&#xff0c;Dreamweaver 2021 for Mac无疑是您的梦幻之选。这款专为Mac用户打造的网页设计工具&#xff0c;集强大的功能与出色的用户体验于一身。 Dreamweaver 2021支持多种网页标准和技术&#xff0c;让您能够轻松创建符合现代网页设计的作品。其…

RespeakPro对口型数字人使用教程

RespeakPro可以将您的视频与音频生成100%精准对口型的视频。与Respeak差别是效率高效果更好。是自媒体制作数字人视频必备黑科技AI. 支持多国语言音频和唱歌音频对口型! 1&#xff1a;系统要求 软件运行支持32/64位window 10/11系统, 无硬件要求,不用显卡也能快速运行。 2&a…

vue+springboot实现excel批量数据的导入导出

①后端配置端口&#xff1a;修改UserController UserController&#xff1a; package com.example.springboot.controller;import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.…

教大家一键下载1688图片信息

电商图片是商品的视觉身份证&#xff0c;对销量有着决定性影响。它们不仅是展示产品&#xff0c;更是讲述品牌故事&#xff0c;激发情感共鸣的工具。高质量的图片能瞬间吸引顾客目光&#xff0c;准确传达产品细节&#xff0c;建立起顾客的信任与购买意愿。在无法亲身体验商品的…

全自动减压器法二氧化碳气容量测试仪:饮料行业的革新与未来

全自动减压器法二氧化碳气容量测试仪&#xff1a;饮料行业的革新与未来 一、引言 在追求品质与效率的现代饮料生产领域&#xff0c;全自动减压器法二氧化碳气容量测试仪凭借其高精度、高效率及无人工干预的显著优势&#xff0c;正逐渐成为行业的标杆。特别是在碳酸饮料的生产中…

【考古篇】Attension is all you need

Transformer 文章目录 Transformer1. What2. Why3. How3.1 Encoder3.2 Decoder3.3 Attention3.4 Application3.5 Position-wise Feed-Forward Networks(The second sublayer)3.6 Embeddings and Softmax3.7 Positional Encoding3.8 Why Self-Attention 1. What A new simple n…

labview技术交流-字符串数组连接成字符串

应用场景 我们可能需要将一维的字符串数组转换成一整条字符串&#xff0c;然后方便记录在数据库或表格中的一个单元格中。 代码展示 方案一 我们使用for循环完成这样的功能需求&#xff0c;见下图&#xff1a; 这种方案可能相对基础和普通&#xff0c;但是它更方便和易于扩展…

JavaSwing技术实现一个电子表程序

使用JavaSwing技术实现一个简单的电子表盘&#xff0c;如下所示。 下载链接 有兴趣的读者可以点击链接下载&#xff0c;博主承诺绝对真实有效。

PyQt5中的事件与信号处理

文章目录 1. 简介1.1事件(Event)1.2 信号(Signal)与槽(Slot)1.3 自定义信号 2. 一个信号与槽的简单示例13. 一个信号与槽的简单示例24. 事件发送者5. 创建自定义信号6. 一个简单计算器 1. 简介 在PyQt5中&#xff0c;事件和信号处理是GUI编程的核心概念。事件是指用户操作或系…

2024年数维杯数维杯数学建模A题思路+论文+代码+结果

A 题 多源机会信号建模与导航分析 尽管全球卫星定位系统下的定位导航技术已成熟&#xff0c;但考虑到室内、 隧道、建筑密集区等复杂环境或全球卫星定位系统被毁失灵等突发场 景&#xff0c;会发生全球卫星定位系统拒止情况&#xff0c;无法有效定位导航。因此&#xff0c; 需要…

Coze扣子开发指南:用免费API自己创建插件

虽然Coze扣子现在插件商店已经有几百个插件了&#xff0c;但相对于海量人群的众多差异化需求&#xff0c;还是远远不够的。如果插件商店没有合适的插件&#xff0c;其实完成可以自己创建&#xff0c;过程也很简单&#xff0c;不需要编写任何代码。 首先打开个人空间&#xff0…

JavaSwing课程设计-实现一个计算器程序

通过JavaSwing技术来实现计算器小程序&#xff0c;效果如下。 源码下载链接 源码下载 博主承诺真实有效&#xff0c;私信可提供支持

Linux系统搭建Gitlab开源仓库管理系统并实现公网环境访问本地私有库

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xf…

内网渗透windows命令绕过

①选项字符替换 有一些命令是unix移植来的,可以使用-&#xff08;横短线&#xff09;&#xff0c;Windows原生选项连接符为/&#xff08;正斜杠&#xff09; 例&#xff1a; ping -h ping /h 像 find之类的命令无法兼容- windows中打开文件,支持直接打开和\.(反斜杠)点的形…

Spark云计算平台Databricks使用,第一个Spark应用程序WordCount

1 上传文件 上传words.txt文件&#xff1a;Spark云计算平台Databricks使用&#xff0c;上传文件-CSDN博客 上传的文件的路径是/FileStore/tables/words.txt&#xff0c;保存在AWS的S3 hello world hello hadoop hello world hello databricks hadoop hive hbase yarn spark …

ESP32-C3模组上跑通MQTT(3)

接前一篇文章&#xff1a;ESP32-C3模组上跑通MQTT&#xff08;2&#xff09; 本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 MQTT协议及使用_mqtt endpoint-CSDN博客 你不得不看的图文并茂的MQTT协议通信过程&#xff01;&#xff01;&#xff01;_mqtt流程图-…

Linux(centos)安装 MySQL 8 数据库(图文详细教程)

前言 前几天写了个window系统下安装Mysql的博客&#xff0c;收到很多小伙伴私信需要Linux下安装Mysql的教程&#xff0c;今天这边和大家分享一下&#xff0c;话不多说&#xff0c;看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹&#xff…