pthead 互斥锁使用详解

news/2025/2/14 1:15:19/

pthead 互斥锁使用

  • 互斥锁:一种简单的线程同步机制,它可以用来保护共享资源,防止多个线程同时修改共享资源而引发竞争条件。

pthread_mutex_init

  • 函数原型:

    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
    
    • mutex:指向要初始化的互斥锁的指针。
    • attr:一个可选的指向互斥锁属性的指针,用于设置互斥锁的属性,可以为 NULL。
    • 返回值:成功返回 0,失败返回错误代码。
  • 用于初始化一个互斥锁。

  • 使用互斥锁时,应该先初始化再使用,最后再销毁。

pthread_mutex_destroy

  • 函数原型:

    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    
    • mutex:指向要销毁的互斥锁的指针
    • 返回值:成功返回 0,失败返回错误代码。
  • 用于销毁一个互斥锁。

  • 销毁互斥锁之前,要确保没有任何线程正在持有该互斥锁,否则会导致未定义的结果。

pthread_mutex_lock

  • 函数原型:

    int pthread_mutex_lock(pthread_mutex_t *mutex);
    
    • mutex:要获取的互斥锁的指针。
  • 用于获取一个互斥锁。

  • 如果一个线程在获取互斥锁时发现该互斥锁已经被其他线程占用,那么它就会被阻塞,直到该互斥锁被释放为止。

  • 在使用互斥锁时,要确保在临界区内的代码尽可能少,以避免长时间占用互斥锁而导致的性能问题。

pthread_mutex_unlock

  • 函数原型:

    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    
    • mutex:要释放的互斥锁的指针。
  • 用于释放一个互斥锁。

  • 只有成功获取互斥锁的线程才能使用 pthread_mutex_unlock 函数释放该互斥锁。如果一个线程在未获取互斥锁的情况下尝试调用 pthread_mutex_unlock 函数,将会产生未定义的行为。

  • 在释放互斥锁之后,其他等待获取该互斥锁的线程将有机会获取到互斥锁,并进入临界区执行其任务。

示例

  • 以下示例演示了两个线程交替写一个文件:

    #include <stdio.h>
    #include <string.h>
    #include <pthread.h>pthread_mutex_t g_mutex;void* thread1_func(void* arg)
    {FILE *fp = (FILE*)arg;// 获取互斥锁pthread_mutex_lock(&g_mutex);// 进入临界区,访问共享资源char *s = "thread1: hello\n";fwrite(s, strlen(s), 1, fp);// 释放互斥锁pthread_mutex_unlock(&g_mutex);return NULL;
    }void* thread2_func(void* arg)
    {FILE *fp = (FILE*)arg;// 获取互斥锁pthread_mutex_lock(&g_mutex);// 进入临界区,访问共享资源char *s = "thread2: hello\n";fwrite(s, strlen(s), 1, fp);// 释放互斥锁pthread_mutex_unlock(&g_mutex);return NULL;
    }int main()
    {// 新建文件FILE* fp = fopen("test.txt", "wt");// 初始化互斥锁pthread_mutex_init(&g_mutex, NULL);// 创建线程pthread_t th1;pthread_t th2;pthread_create(&th1, NULL, thread1_func, fp);pthread_create(&th2, NULL, thread2_func, fp);// 等待线程结束pthread_join(th1, NULL);pthread_join(th2, NULL);// 销毁互斥锁pthread_mutex_destroy(&g_mutex);// 关闭文件fclose(fp);return 0;
    }
    

http://www.ppmy.cn/news/1185958.html

相关文章

初学编程入门基础教学视频,中文编程开发语言工具箱之豪华编辑构件,免费版中文编程软件下载

初学编程入门基础教学视频&#xff0c;中文编程开发语言工具箱之豪华编辑构件&#xff0c;免费版中文编程软件下载 构件的其中一个属性、方法&#xff0c;查找内容&#xff0c;替换内容。 构件工具箱非常丰富&#xff0c;其中该构件在 文本件构件板菜单下。 编程系统化课程总目…

Typora 最新激活方法

Markdown是一种可以使用普通文本编辑器编写的标记语言&#xff0c;通过简单的标记语法&#xff0c;它可以使普通文本内容具有一定的格式&#xff0c;其目标是实现易读易写。而Typora则是一个非常不错的Markdown编辑器&#xff0c;它的界面非常的简洁直观&#xff0c;并且功能各…

15. 机器学习 - 支持向量机

Hi, 你好。我是茶桁。 逻辑回归预测心脏病 在本节课开始呢&#xff0c;我给大家一份逻辑回归的练习&#xff0c;利用下面这个数据集做了一次逻辑回归预测心脏病的练习。 本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内&#xff0c;数据集的获取在文末。这样做是因为我…

chapter 3-6

文章目录 3.检测两个整数是否有相反的符号4.计算整数的绝对值&#xff08;abs&#xff09;而不使用分支5.计算两个整数的最小值或最大值而不使用分支6.确定一个整数是否是2的幂 3.检测两个整数是否有相反的符号 //检测两个整数是否有相反的符号 int x, y; // 要…

港联证券:注册制意味着什么?

跟着我国本钱商场变革的不断深化&#xff0c;注册制在近年来成为了备受关注的论题。注册制的施即将改动原有的核准原则&#xff0c;关于股票和债券的发行&#xff0c;将由事后监管转变为事前挂号审理。那么&#xff0c;注册制意味着什么呢&#xff1f;本文将从经济、商场和出资…

vue的.sync修饰符用法及原理详解

.sync 作用 当一个子组件改变了一个 prop 的值时&#xff0c;这个变化也会同步到父组件中所绑定。 .sync 原理 利用EventBus&#xff0c;子组件触发事件&#xff0c;父组件响应事件并实现数据的更新&#xff0c;避免由子组件直接修改父组件传过来的内容。&#xff08;如果子组…

优先队列PriorityQueue

前言 PriorityQueue这个队列不知道大家使用过吗&#xff0c;反正我用的很少&#xff0c;主要对它不是很了解&#xff0c;今天我带领大家剖析下PriorityQueue这个优先级队列。 PriorityQueue介绍 顾名思义&#xff0c;PriorityQueue是优先队列的意思。优先队列的作用是能保证每…

JavaScript_Pig Game重置游戏

//重置游戏 btnNew.addEventListener(click, function () {score0El.textContent 0;score1El.textContent 0;current0El.textContent 0;current1El.textContent 0;player0El.classList.remove(player--winner);player1El.classList.remove(player--winner);player0El.class…