pthread_mutex_init线程互斥锁的使用

2023-11-07

pthread_mutex_init

头文件:

#include <pthread.h>

函数原型:

int pthread_mutex_init(pthread_mutex_t *restrict_mutex,const pthread_mutexattr_t *restrict_attr);

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

示例对比

下面代码是创建了两个现象,线程1对全局变量gnum自增3次,线程2对其自增5次

1:未使用线程锁得情况

/*************************************************************************
    > File Name: pthread.c
    > Author: kayshi
    > Mail: kayshi2019@qq.com
    > Created Time: Mon 21 Sep 2020 03:12:09 PM CST
 ************************************************************************/

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

int gnum = 0;

static void thread_fun1(void)
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {   
        printf("this is  thread1\n");
        sleep(1);
        gnum++;
        printf("thread1 add  one to num %d\n", gnum);
    }   
}

static void thread_fun2(void)
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {   
        printf("this is  thread2\n");
        sleep(1);
        gnum++;
        printf("thread2 add  one to num %d\n", gnum);
    }   
}

int main()
{
    pthread_t id1, id2;
    printf("start\n");
    pthread_create(&id1, NULL, (void *)thread_fun1, NULL);
    pthread_create(&id2, NULL, (void *)thread_fun2, NULL);
    pthread_join(id1, NULL);
    pthread_join(id2, NULL);
    printf("end\n");
}

在这里插入图片描述
通过上面发现,线程1和线程2会交替着对全局变量递增,属于不可控制得状态

2:添加线程锁

/*************************************************************************
    > File Name: pthread.c
    > Author: kayshi
    > Mail: kayshi2019@qq.com
    > Created Time: Mon 21 Sep 2020 03:12:09 PM CST
 ************************************************************************/

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

int gnum = 0;
pthread_mutex_t mutex;

static void thread_fun1(void)
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {   
        pthread_mutex_lock(&mutex);
        printf("this is  thread1\n");
        sleep(1);
        gnum++;
        printf("thread1 add  one to num %d\n", gnum);
        pthread_mutex_unlock(&mutex);
    }   
}

static void thread_fun2(void)
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {   
        pthread_mutex_lock(&mutex);
        printf("this is  thread2\n");
        sleep(1);
        gnum++;
        printf("thread2 add  one to num %d\n", gnum);
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    pthread_t id1, id2;
    printf("start\n");
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&id1, NULL, (void *)thread_fun1, NULL);
    pthread_create(&id2, NULL, (void *)thread_fun2, NULL);
    pthread_join(id1, NULL);
    pthread_join(id2, NULL);
    printf("end\n");
}

在这里插入图片描述
通过上面得现象发现,线程2先对变量递增,然后线程1再对变量递增。

线程锁得作用就在于,当一个线程获取锁执行后,另一个也需要获得该锁得线程就会阻塞等待这个锁得释放然后才能得以执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pthread_mutex_init线程互斥锁的使用 的相关文章

  • C++拷贝构造函数详解

    一 什么是拷贝构造函数 首先对于普通类型的对象来说 它们之间的复制是很简单的 例如 int a 100 int b a 而类对象与普通对象不同 类对象内部结构一般较为复杂 存在各种成员变量 下面看一个类对象拷贝的简单例子 include
  • Qlik Sense Desktop 初步体验

    点击进入 QlikView QlikSense 社区 交流群 432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 如果图片显示不正常 可以重新刷新一下页面显示 个人感觉报表的设计
  • C语言扫雷游戏

    一 思路 设计两个二维数组 mine和show mine用来存放布置雷的信息 show用来存放排查雷的信息 mine数组初始化为 0 布置雷时改为 1 show数组初始化为 排除雷后改为数字字符 周围有几个雷就为数字几 二 game函数 先
  • 【Spring

    应用上下文 应用上下文和资源路径 构造应用上下文 构造ClassPathXmlApplicationContext实例 快捷方式 使用通配符 蚂蚁式图案 类路径 前缀 应用上下文和资源路径 本节介绍如何使用资源创建应用程序上下文 包括使用
  • 线程的生命周期

    线程的生命周期
  • opencv将16位灰度图片转化为8位

    大家在加载灰度图时 一定要看准图片存储格式位数 opencv默认为8位读取 如果该图为16位 则读取为全0 导致程序出错 以下代码只需修改路径 可以批量处理图片 include

随机推荐

  • 手机相关公开数据集分享

    可用于手机价格预测 图像分类等训练 1 Flipkart 手机数据集 按品牌列出的手机规格 Apple Samsung 等 该数据集包含印度最受欢迎的 5 个移动品牌的描述 列 有 16 列 每列都有一个不言自明的标题 行 有 430 行
  • python爬虫二十一:app移动端数据抓取(一)

    1 移动端app数据 1 1为什么要抓取移动端数据 随着时代的发展 pc gt 移动端 gt 大数据 gt AI 人工智能未来 对于做数据分析 用户画像 市场调研来说仅仅参考PC端的数据是远远不够的 那么于此同时移动的数据就显得尤为的重要
  • 【WSL】WSL/WSL2安装

    WSL安装 参考 microsoft官网教程 WSL安装 系统要求 WSL WSL2的安装 Linux发行版WSL版本选择 安装linux发行版 WSL移动到其他磁盘 系统要求 必须运行 Windows 10 版本 2004 及更高版本 内
  • 软件测试——基础理论知识你都不一定看得懂

    目录 前言 软件测试 Software Testing 的定义 软件测试的分类 软件测试的常用种类 测试用例八大设计方法 结语 前言 入软件测试这一行至今已经10年多 承蒙领导们的照顾与重用 同事的支持与信任 我的职业发展算是相对较好 从入
  • Pyppeteer的使用——爬取京东

    1 Pyppeteer优势 不用像Selenium一样配置浏览器环境 可以直接在页面上进行爬取 爬取的不是页面源码而是已经加载完毕的 显示在浏览器上的页面 可以绕过加密系统 Pyppeteer加载的text 是加载完成后的HTML页面 所有
  • ad如何计算电路板的pin数量_一招教你学会使用AD更改PCB板子尺寸!

    原标题 一招教你学会使用AD更改PCB板子尺寸 使用原理图生成PCB后 Altium Designer会自动生成一块黑色区域 还有一个在禁止布线层的方框 还有两段标注板子大小的线 下面说一下如何更改黑色区域的大小 还有如何精确确定板子尺寸
  • DES密码算法实现(C语言)

    算法介绍 DES算法为密码体制中的对称密码体制 又被称为美国数据加密标准 是1972年美国IBM公司研制的对称密码体制加密算法 明文按64位进行分组 密钥长64位 密钥事实上是56位参与DES运算 第8 16 24 32 40 48 56
  • 【腾讯云TDSQL-C Serverless 产品测评】一文带你了解TDSQL-C Serverless版

    文章目录 前言 腾讯云TDSQL C for MySQL Serverless版介绍 准备工作 1 购买TDSQL C for MySQL Serverless版实例 2 开启数据库外网访问 3 安装测试工具 4 准备测试数据 Server
  • 记录android遇到的SecurityException

    记录android遇到的SecurityException 一 java lang SecurityException getUniqueDeviceId The user 10283 does not meet the requireme
  • List和ArrayList

    List和ArrayList区别 List是一个接口 而ArrayList是List接口的一个实现类 ArrayList类继承并实现了List接口 因此 List接口不能创建实例对象 但是可以为List接口创建一个指向自己的对象引用 而Ar
  • 微信公众号小程序开通方法_微信小程序发布审核大概要多久

    1 如果自己有通过微信公众平台注册认证好微信公众号 那么只需要登录微信公众号账号后在页面左侧找到小程序管理 注册认证小程序账号 注意 公众号账号和小程序账号是独立的两个账号 2 如果自己没有注册认证微信公众号 就可以先到微信公众平台注册个微
  • ubuntu 18.04下virtualbox安装windows虚拟机+增强功能+secureCRT

    先强调一下 我是在Ubuntu里安装windows虚拟机 如果要看如何安装linux虚拟机的话 那么你走错地方了 我一直使用Linux系统做开发的 选择Ubuntu是因为多数常用软件对Ubuntu支持的不错 能少折腾就少折腾 程序员的时间不
  • Qt5.12.3移植rk3399pro笔记

    Qt5 12 3移植到rk3399pro笔记 环境 主机 Ubuntu16 04 目标机 rk3399pro板 x11平台 交叉编译toolchain linux aarch64 gnu 问题描述 我的目标机是debian系统 带lxde桌
  • 【大数据】HiveQL的数据操作

    HiveQL的数据操作 因为 Hive 没有行级别的数据插入 数据更新和删除操作 那么往表中装载数据的唯一途径就是使用一种 大量 的数据装载操作 或者通过其他方式仅仅将文件写入到正确的目录下 1 向管理表中装载数据 LOAD DATA LO
  • SpringFactoriesLoader ServiceLoader区别

    内容简介 IoC 并不仅限于解决模块内类与类之间的依赖耦合问题 其同样适用于模块与模块之间 OSGi 一直致力于这方面的工作 但其实 Java 和 Spring 都提供了对 IoC 的支持 Java 本身提供了一种很简便的方式来支持 IoC
  • 报告

    来源 Prophet 2019年 战略数字化转型的重要性已经不止于IT领域 而影响着全公司的竞争力 企业的相关预算直线攀升 利益相关方所关注的颠覆性技术数量急剧增加 数字化项目开始由首席高管主导 并由相互协作的跨职能团队管理 数字化是整个企
  • 爬虫项目五:最详细的京东商品、评价爬虫、词云展示

    文章目录 前言 一 京东商品信息爬虫 1 分析URL 2 实例化chrome 3 加载完整数据 4 实现翻页 5 解析数据 二 京东商品评价爬虫 1 找到接口 2 分析url 3 解析数据 4 词云 前言 本文内容包含京东商品列表爬虫的详细
  • pycharm启动报错

    1 点击pycharm 报错 2 打开cmd 输入gpedit msc 点击 确定 3 在本地组策略编辑器 选择 Windows设置 安全设置 本地策略 安全选项 用户帐户控制 用于内置管理员帐户的管理员批准模式 4 设置 用户帐户控制 用
  • cuda历史版本和cudnn的下载地址

    cuda历史版本下载地址 https developer nvidia com cuda toolkit archive cudnn下载地址 https developer nvidia com rdp cudnn archive 欢迎大家
  • pthread_mutex_init线程互斥锁的使用

    pthread mutex init 头文件 include