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

pthread_mutex_lock与pthread_mutex_unlock

pthread_mutex_lock函数与pthread_mutex_unlock是一般成对使用。pthread_mutex_lock与pthread_mutex_unlock之间代码不会被被别的进程中断。类似原子类的执行。
参考一下代码,当两个线程同时访问cnt时,会发生冲突。

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>#define N 10int cnt = 0;void* thread_fun_0(void* arg) {for (int i = 0; i < N; ++i) {       printf("thread id[%ld]-----%d\n",pthread_self(),cnt);++cnt;        usleep(100);}return NULL;
}void* thread_fun_1(void* arg) {for (int i = 0; i < N; ++i) {     printf("thread id[%ld]-----%d\n",pthread_self(),cnt);++cnt;     usleep(100);}return NULL;
}
int main() {pthread_t t1, t2;pthread_create(&t1, NULL, thread_fun_0, NULL);pthread_create(&t2, NULL, thread_fun_1, NULL);pthread_join(t1, NULL);pthread_join(t2, NULL);printf("cnt = %d (expect %d)\n", cnt, 2*N);return 0;
}

在这里插入图片描述

每个线程是的cnt 递增10次,进程结束cnt应该是20。这次运行结果有问题,按理输出的cnt应该是1~20,不会重复。但是运行结果却重复了,这是因为对cnt更新时没有锁定系统。修改后代码如下:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>#define N 10
pthread_mutex_t mux = PTHREAD_MUTEX_INITIALIZER;
int cnt = 0;void* thread_fun_0(void* arg) {for (int i = 0; i < N; ++i) {pthread_mutex_lock(&mux);printf("thread id[%ld]-----%d\n",pthread_self(),cnt);++cnt;        pthread_mutex_unlock(&mux);usleep(100);}return NULL;
}void* thread_fun_1(void* arg) {for (int i = 0; i < N; ++i) {pthread_mutex_lock(&mux);printf("thread id[%ld]-----%d\n",pthread_self(),cnt);++cnt;        pthread_mutex_unlock(&mux);usleep(100);}return NULL;
}
int main() {pthread_t t1, t2;pthread_create(&t1, NULL, thread_fun_0, NULL);pthread_create(&t2, NULL, thread_fun_1, NULL);pthread_join(t1, NULL);pthread_join(t2, NULL);printf("cnt = %d (expect %d)\n", cnt, 2*N);pthread_mutex_destroy(&mux);return 0;
}

在这里插入图片描述
本次的运行结果很理想,没有出现冲突。


文章转载自:

http://AWsRp3R5.gkjyg.cn
http://G3CVcAG9.gkjyg.cn
http://Em1S57n5.gkjyg.cn
http://r8zwNah9.gkjyg.cn
http://CLtStvGJ.gkjyg.cn
http://Iy6IsuYn.gkjyg.cn
http://CA7Ohgc6.gkjyg.cn
http://JfiEqqrR.gkjyg.cn
http://FZjkIUNm.gkjyg.cn
http://d2ELW77W.gkjyg.cn
http://NM97XyBy.gkjyg.cn
http://yFX1yQ7I.gkjyg.cn
http://xRyBTTvp.gkjyg.cn
http://l7mMOVK6.gkjyg.cn
http://l83I0CKf.gkjyg.cn
http://Qn15IHfb.gkjyg.cn
http://UXzPXyxj.gkjyg.cn
http://6U32qAXe.gkjyg.cn
http://jqO9roxb.gkjyg.cn
http://SEfdrQmU.gkjyg.cn
http://ZK7oXkAS.gkjyg.cn
http://WfpLNOBT.gkjyg.cn
http://9DmECaIr.gkjyg.cn
http://FTiRKI1L.gkjyg.cn
http://xDYytLa5.gkjyg.cn
http://bWQiTXz1.gkjyg.cn
http://wUcJ0n34.gkjyg.cn
http://hwCPX2TZ.gkjyg.cn
http://2qN6U68x.gkjyg.cn
http://gj0Dm0C4.gkjyg.cn
http://www.dtcms.com/a/369204.html

相关文章:

  • 【完整源码+数据集+部署教程】广告牌实例分割系统源码和数据集:改进yolo11-dysample
  • CUDA编程12 - 使用OpenMP控制多个GPU示例
  • TortoiseGit 2.4.0.0 64位安装教程(附详细步骤和Git配置 附安装包)
  • 禁毒教育展厅互动设备-禁毒教育基地-禁毒体验馆方案-VR禁毒教育软件
  • Fairness, bias, and ethics|公平,偏见与伦理
  • Nginx +Tomcat架构的必要性与应用示例
  • 沙堆状态的可视化图和雪崩分布
  • JavaWeb —— 异常处理
  • ppp与ip类型wan对比
  • leetcode399.除法求值
  • 电磁波成像(X射线、CT成像)原理简介
  • RikkaHub:安卓原生AI聊天新体验
  • Linux之Ubuntu桌面化操作系统的安装
  • CASToR 生成的文件进行转换
  • AI架构师的思维方式与架构设计原则
  • 软考 系统架构设计师系列知识点之杂项集萃(140)
  • 修改上次提交的Git提交日志
  • 【可信数据空间-连接器状态监控-Java代码集成】
  • C语言(长期更新)第15讲 指针详解(五):习题实战
  • 全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动
  • .Net程序员就业现状以及学习路线图(四)
  • 垃圾回收算法详解
  • 【QT 5.12.12 打包-Windows 平台下】
  • 2025高教社数学建模国赛B题 - 碳化硅外延层厚度的确定(完整参考论文)
  • 【设计模式】UML 基础教程总结(软件设计师考试重点)
  • 三维聚类建模
  • Web 转发机制深度解析
  • 鸿蒙NEXT自定义能力详解:从基础使用到高级技巧
  • Coze源码分析-资源库-删除提示词-前端源码
  • leedcode 算法刷题第二七天