当前位置: 首页 > article >正文

现代C++多线程基础 -忆苦思甜pthread_mutex

c 老古董

文章目录

  • c 老古董
    • pthread_mutex
      • 概念
      • 常用api
          • pthread_mutex_init
          • pthread_mutex_lock
          • pthread_mutex_trylock
          • `pthread_mutex_unlock`
          • `pthread_mutex_destroy`
      • 案例

pthread_mutex

概念

互斥锁 mutex是一种简单的加锁的方法来控制对共享资源的访问,mutex只有两种状态,即

上锁(lock)

解锁(unlock)。

在访问该资源前,首先应申请mutex,

  • 如果mutex处于lock状态,则默认阻塞申请者。

  • 如果mutex处于unlock状态,则会申请到mutex并立即lock;

    unlock操作应该由lock者进行

常用api

pthread_mutex_init
  • 静态分配
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • 动态分配
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);

pthread_mutex_t mutex;

pthread_mutex_init(&mutex, NULL);

功能

  • 初始化一个互斥锁。

参数:

  • mutex:指定的互斥锁 互斥锁地址。
  • attr:互斥锁的属性,NULL 为默认的属性。

返回值:

  • 成功返回 0,失败返回非 0。
pthread_mutex_lock
#include <pthread.h> 

int pthread_mutex_lock(pthread_mutex_t *mutex); 

功能:

  • 对互斥锁上锁,
  • 若已经上锁,则调用者一直阻塞到互斥锁解锁

参数:

  • mutex:指定的互斥锁 互斥锁地址。

返回值:

  • 成功返回 0,失败返回非 0。
pthread_mutex_trylock
#include <pthread.h> 

int pthread_mutex_trylock(pthread_mutex_t *mutex);

功能:

  • 对互斥锁上锁,
  • 若已经上锁,则上锁失败,函数立即返回。

参数:

  • mutex:指定的互斥锁 互斥锁地址。

返回值:

  • 成功返回 0,失败返回非 0。
pthread_mutex_unlock
#include <pthread.h>

int pthread_mutex_unlock(pthread_mutex_t * mutex);

功能:

  • 对指定的互斥锁解锁。

参数:

  • mutex:互斥锁地址。

返回值:

  • 成功返回 0,失败返回非 0。
pthread_mutex_destroy

在所有使用过此互斥锁的线程都不再需要使用时候,应调用pthread_mutex_destroy销毁互斥锁

pthread_mutex_t mymutex;    
pthread_mutex_init(&mymutex, NULL);

// 当互斥锁使用完毕后,要销毁
pthread_mutex_destroy(&mymutex);

案例

两人公用同一银行账户。

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

//通过互斥锁解决线程间互斥问题

int money = 10000;

//第一步:创建互斥锁(由于两个线程操作同一个互斥锁,所以定义在全局更加方便一点)
pthread_mutex_t mymutex;

void *pthread_fun1(void *arg)
{
    int get, rest, actual;
    get = 10000;
    
    //第三步:对共享资源的操作进行上锁
    pthread_mutex_lock(&mymutex);

    printf("张三正在查询余额...\n");
    sleep(1);
    rest = money;

    printf("张三正在取钱...\n");
    sleep(1);
    if(get > rest)
    {
        actual = 0;
    }
    else 
    {
        actual = get;
        rest = rest - get;
        money = rest;
    }

    printf("张三想取%d元,实际取了%d元,余额为%d元\n", get, actual, rest);

    //第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

void *pthread_fun2(void *arg)
{
    int get, rest, actual;
    get = 10000;

    //第三步:对共享资源的操作进行上锁
    pthread_mutex_lock(&mymutex);
    
    printf("李四正在查询余额...\n");
    sleep(1);
    rest = money;

    printf("李四正在取钱...\n");
    sleep(1);
    if(get > yu)
    {
        actual = 0;
    }
    else 
    {
        actual = get;
        rest = rest - get;
        money = rest;
    }

    printf("李四想取%d元,实际取了%d元,余额为%d元\n", get, actual, rest);

    //第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

int main(int argc, char const *argv[])
{
    //第二步:初始化互斥锁
    pthread_mutex_init(&mymutex, NULL);

    pthread_t thread1, thread2;

    if(pthread_create(&thread1, NULL, pthread_fun1, NULL) != 0)
    {
        perror("fail to pthread_create");
        exit(1);
    }

    if(pthread_create(&thread2, NULL, pthread_fun2, NULL) != 0)
    {
        perror("fail to pthread_create");
        exit(1);
    }

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    //第五步:当互斥锁使用完毕后,要销毁
    pthread_mutex_destroy(&mymutex);
    
    return 0;
}

http://www.kler.cn/a/541920.html

相关文章:

  • 网络安全与AI:数字经济发展双引擎
  • 基于 STM32 平台的音频特征提取与歌曲风格智能识别系统
  • 大模型基本原理(二)——ChatGPT的工作原理
  • 【详细版】DETR系列之Deformable DETR(2021 ICLR)
  • Linux 创建进程 fork()、vfork() 与进程管理
  • 深度学习-利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断
  • 外贸网站源码 助力企业抢占蛇年市场先机!
  • 使用redis实现 令牌桶算法 漏桶算法
  • TCP传输层协议
  • Terraform 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
  • 【使用 rimraf 闪电删除 node_modules 目录】
  • 嵌入式接单/派单网站
  • Cursor 编辑器详细介绍与使用
  • 负载测试和压力测试的原理分别是什么
  • Redis 集群工作原理? 如何通信?MOVED和ASKED 有什么区别
  • RabbitMQ消息队列 发送和接受
  • CP AUTOSAR标准之IOHardwareAbstraction(AUTOSAR_SWS_IOHardwareAbstraction)(更新中……)
  • 洛必达法则的证明与重要条件
  • DaDianNao:一种无主存储器的多核加速器
  • 机器学习算法的种类(机器学习类型的比较)
  • FPGA开发技能(10)热电偶测温ADS1118方案
  • Docker Desktop 镜像源配置
  • Spring Boot部署到服务器
  • 物联网智能语音控制灯光系统设计与实现
  • STM32_USART通用同步/异步收发器
  • soular基础教程-使用指南