首页 > 系统相关 >linux 互斥锁mutex锁使用示例

linux 互斥锁mutex锁使用示例

时间:2024-07-17 15:59:35浏览次数:15  
标签:示例 lock counter 互斥 线程 pthread mutex

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

linux 互斥锁mutex锁使用示例,两个线程操作一个全局变量。


提示:以下是本篇文章正文内容,下面案例可供参考

一、互斥锁mutex是什么?

互斥锁(Mutex,Mutual Exclusion Object的简称)是一种常用的同步机制,用于控制多个线程或进程对共享资源的独占访问。在多线程或多进程编程中,当多个执行单位(如线程)需要访问同一份共享数据时,如果没有适当的同步措施,可能会导致竞态条件(race condition),从而引起程序行为的不确定性。

  1. 互斥锁(Mutex)
  • 适用场景:当需要保护一个共享资源,确保同一时刻只有一个线程可以访问时,互斥锁是首选。
  • 优点:简单易用,支持递归锁,即允许一个线程多次锁定同一个锁而不死锁。
  • 缺点:如果线程被调度器挂起或阻塞,持有锁的线程可能无法及时释放锁,导致其他线程等待。

当一个线程对互斥锁(mutex)加锁后,任何其他试图对该锁加锁的线程都将被阻塞,直到原始持有锁的线程释放锁。
互斥锁用在 同一个进程的线程间 使用
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_trylock
pthread_mutex_unlock

二、代码示例

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

// 定义一个全局变量
int global_counter = 0;

// 创建一个互斥锁
pthread_mutex_t counter_lock;

// 函数用于修改全局变量
void increment_counter() {
    //pthread_mutex_lock(&counter_lock); // 加锁
    int ret = -1;

    while(ret != 0)
    {
    ret = pthread_mutex_trylock(&counter_lock);
    if(0 == ret)
    {
        global_counter++;                  // 修改全局变量
        pthread_mutex_unlock(&counter_lock); // 解锁
    }else if(ret == EBUSY)
    {
        printf("EBUSY\n");
    }else
    {
        printf("pthread_mutex_trylock error ret = %d\n", ret);
    }
    }
}

// 线程函数
void* thread_function(void* arg) {
    int i;
    for (i = 0; i < 10; i++) {
        printf("thread_function enter id = %d, i = %d, global_counter = %d\n", *((int *)arg),i, global_counter);
        increment_counter();
        usleep(1); // 防止第一个线程执行完,第二个线程才执行
    }
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    int i = 1;
    int j = 2;

    // 初始化互斥锁
    pthread_mutex_init(&counter_lock, NULL);

    // 创建两个线程
    pthread_create(&thread1, NULL, thread_function, &i);
    pthread_create(&thread2, NULL, thread_function, &j);

    // 等待两个线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 销毁互斥锁
    pthread_mutex_destroy(&counter_lock);

    // 输出最终的全局变量值
    printf("Final value of the counter is %d\n", global_counter);

    return 0;
}

总结

应用层c,互斥锁的基本使用,代码可以运行。

标签:示例,lock,counter,互斥,线程,pthread,mutex
From: https://blog.csdn.net/qq_37077309/article/details/140497537

相关文章

  • Nacos(二)源码分析Nacos服务端注册示例流程
    上回我们讲解了客户端配置好nacos后,是如何进行注册到服务器的,那我们今天来讲解一下服务器端接收到注册实例请求后会做怎么样的处理。首先还是把博主画的源码分析图例发一下,让大家对整个流程有一个大概的理解:图示流程地址:https://www.processon.com/view/link/5f7e895......
  • python接口测试示例
    1、从sql读取需要的内容,作为接口的请求参数的一部分,生成请求的body,再去请求接口1importrequests2importpymysql3importjson456conn=pymysql.connect(host="172.16.11.118",port=3306,user="root",passwd="123456",db="digital_energy_base&......
  • 【python学习】第三方库之pandas库的定义、特点、功能、使用场景和代码示例
    引言pandas是一个强大的Python库,用于数据分析和数据处理。它基于NumPy,提供了灵活的数据结构(Series和DataFrame)和数据操作功能,是数据科学和机器学习中不可或缺的工具文章目录引言一、安装`pandas`第三方库二、`pandas`的定义三、特点3.1强大的数据结构3.2灵活的数据......
  • Pytorch的编译新特性TorchDynamo的工作原理和使用示例
    在深度学习中,优化模型性能至关重要,特别是对于需要快速执行和实时推断的应用。而PyTorch在平衡动态图执行与高性能方面常常面临挑战。传统的PyTorch优化技术在处理动态计算图时效果有限,导致训练时间延长和模型性能不佳。TorchDynamo是一种为PyTorch设计的即时(JIT)编译器,通过在运行时......
  • OpenSSL RSA相关基本接口和编程示例
    本文测试代码基于Openssl版本:1.1.1fRSA接口接口简介RSA对象创建intRSA_generate_key_ex(RSA*rsa,intbits,BIGNUM*e,BN_GENCB*cb);功能:创建⼀对rsa的公钥私钥参数:RSA密钥指针,密钥bit位数,公钥指数的⼤数形式指针,回调函数返回:成功返回1,失败返回0e主要有两个取值......
  • easyExcel使用示例
    引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>4.0.1</version> </dependency>动态合并单元格 List<List<String>>head=newArrayList<>(......
  • 纳米体育数据API电竞数据接口:实时数据包接口文档API示例②
    纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本包含http协议以及websocket协议,主要通过http获取数......
  • 深入理解Linux内核中的同步与互斥的实现
    1.内联汇编汇编函数的执行效率比C语言更高,但可移植性,可编程性和可读性更差,掌握也更复杂。所以一般使用C语言编程。1.1内联汇编的优点性能优化:内联汇编允许开发者利用底层硬件特性,编写出更高效的代码,尤其是在性能敏感的场景下。直接硬件控制:内联汇编可以直接对硬件寄存......
  • DDD | 02-值对象拓展示例
    示例拓展金额和货币创建一个表示金额和货币的值对象(AmountVO),在系统中统一处理货币相关的数据,确保精度和一致性。importjava.math.BigDecimal;importjava.util.Currency;/***这个AmountVO类使用BigDecimal来精确存储金额值,避免了浮点运算可能带来的精度问题。同时,利用C......
  • Python学习代码示例合集
    PythonDemo示例合集PyDemo:Python学习代码示例合集介绍欢迎来到PyDemo,这是一个专为Python学习者设计的代码示例合集。无论你是编程新手还是经验丰富的开发者,PyDemo都将为你提供有用的代码片段,帮助你快速掌握Python编程的各种技巧和应用场景。项目背景Python作......