Linux线程-互斥锁pthread_mutex_t

Linux线程同步(2)——初识互斥锁 互斥锁(mutex)又叫互斥量,从本质上说是一把锁,在访问共享资源之前对互斥锁进行上锁,在访问完成后释放互斥锁(解锁);对互斥锁进行上锁之后,任何其它试图再次对互斥锁进行加锁的线程都会被阻塞,直到当前线程释放互斥锁。如果释放互斥锁时有一个以上的线程阻塞,那么这些阻塞的线程会被唤醒, 它们都会尝试对互斥锁进行加锁,当有一个线程成功对互斥锁上锁之后,其它线程就不能再次上锁了,只能再次陷入阻塞,等待下一次解锁。 阅读详情
在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。






一,锁的创建


    锁可以被动态或静态创建,可以用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,采用这种方式比较容易理解,互斥锁是pthread_mutex_t的结构体,而这个宏是一个结构常量,如下可以完成静态的初始化锁:


    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


    另外锁可以用pthread_mutex_init函数动态的创建,函数原型如下:


    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)


二,锁的属性


    互斥锁属性可以由pthread_mutexattr_init(pthread_mutexattr_t *mattr);来初始化,然后可以调用其他的属性设置方法来设置其属性;


    互斥锁的范围:可以指定是该进程与其他进程的同步还是同一进程内不同的线程之间的同步。可以设置为PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默认是后者,表示进程内使用锁。可以使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)


pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)


用来设置与获取锁的范围;


    互斥锁的类型:有以下几个取值空间:


  PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。


   PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。


   PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。


   PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。


可以用
 pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
 pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)


获取或设置锁的类型。


三,锁的释放


    调用pthread_mutex_destory之后,可以释放锁占用的资源,但这有一个前提上锁当前是没有被锁的状态。


四,锁操作


    对锁的操作主要包括加锁 pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个。


  int pthread_mutex_lock(pthread_mutex_t *mutex)


   int pthread_mutex_unlock(pthread_mutex_t *mutex)


   int pthread_mutex_trylock(pthread_mutex_t *mutex)


   pthread_mutex_trylock()语义与pthread_mutex_lock()类似,不同的是在锁已经被占据时返回EBUSY而不是挂起等待


五,锁的使用


[cpp] view plain
copy


#include <pthread.h>  
#include <stdio.h>  
  
pthread_mutex_t mutex ;  
void *print_msg(void *arg){  
        int i=0;  
        pthread_mutex_lock(&mutex);  
        for(i=0;i<15;i++){  
                printf("output : %d\n",i);  
                usleep(100);  
        }  
        pthread_mutex_unlock(&mutex);  
}  
int main(int argc,char** argv){  
        pthread_t id1;  
        pthread_t id2;  
        pthread_mutex_init(&mutex,NULL);  
        pthread_create(&id1,NULL,print_msg,NULL);  
        pthread_create(&id2,NULL,print_msg,NULL);  
        pthread_join(id1,NULL);  
        pthread_join(id2,NULL);  
        pthread_mutex_destroy(&mutex);  
        return 1;  
}  
将会一个线程一个线程的执行。
C语言pthread互斥锁(mutex)和可重入锁(递归锁recursive)的演示 1 一旦共享资源被互斥锁锁定,则其余线程想访问共享资源必须等待,直到锁被释放。使用mutex的属性,开启递归锁(可重入锁),解决同一线程可重入问题。2 使用normal属性的互斥锁,一旦发生重入逻辑,则阻塞,成为死锁。需要将属性改为recursive 成为可重入的,递归的。unix-like操作系统 gnu_c或兼容c库。演示未使用可重入锁对资源的重入访问。演示使用互斥锁后 线程的执行顺序。1 命令行传参 1 model=1。2 命令行传参 2 model=2。3 命令行传参 3 model=3。 阅读详情

相关推荐

Linux互斥锁及其应用

文章目录互斥锁1.1锁的创建1.2 锁操作1.3 锁销毁1.4互斥锁属性初始化互斥锁属性对象pthread_mutexattr_init 语法pthread_mutexattr_init 返回值销毁互斥锁属性对象pthread_mutexattr_destroy 语法pthread_mutexattr_destroy 返回值案例遇到问题解决方案1.在循环外加锁解锁2.在循环内加锁解锁(效率最高) 互斥锁 作用: 防止多线程对同一个数据同时进行操作 在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以

流楚丶格念的博客 5081

Linux 互斥锁

互斥的概念 在多线程编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。 每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻, 只能有一个线程访问该对象。 互斥锁操作 互斥锁也可以叫线程锁,接下来说说互斥锁的的使用方法。 对互斥锁进行操作的函数,常用的有如下几个: #include <pthread.h> int pthread_mu...

weixin_30408675的博客 563

Geoserver新手必看:5分钟搞定世界地图发布(附中国省市数据)

本文为Geoserver新手提供了快速发布世界地图的实战指南。从环境搭建、数据准备入手,详细讲解了如何创建工作区、添加数据存储、发布图层及配置关键参数,并最终通过创建图层组实现地图服务的整合与预览。文章旨在帮助用户快速掌握Geoserver发布地图服务的核心流程与实用技巧。

cola5的博客 223

C语言演示互斥锁

有共享资源、合作关系的线程之间由于并发交替运行,可能导致运行结果不正常。 下面模拟火车票购票系统,有三个售票窗口同时售票 由于线程的并发执行,导致出现非法的剩余票数。 假设num=1,线程T0进入休眠状态,保护现场后系统调度线程T1,T1休眠调度T2,T2休眠后T0休眠时间到被唤醒并执行num--,T1休眠时间到被唤醒并执行num--,T2休眠时间到被唤醒并执行num-- 加入互斥锁,一个线程在进入临界区时获得锁,其他线程无法进入临界区,在退出临界区时释放锁,其他进程便可

qq_43641035的博客 2999

【编号326】全国地灾数据全国25万多个地质灾害点空间分布数据

全国地质灾害点分布数据涵盖25万多个各类灾害点信息,为灾害防治提供重要依据。通过分析灾害分布规律,可识别高风险区,指导监测预警、应急避险和基础设施建设。多地成功案例(如湖北兴山崩塌避险、重庆长寿滑坡预警、湖南"挪床行动")证明,提前预警和科学防治能有效避免人员伤亡。云南省2024年通过预警体系成功避让31起灾害,保护1342人生命安全。这些实践表明,地质灾害防治需结合科技手段与群防体系,实现早预警、早处置。

千奇百怪无奇不有 1472

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 317

linux线程锁 pthread_mutex_init,详细的互斥锁pthread_mutex_t的使用

互斥锁pthread_mutex_t的使用有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下:pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIA...

weixin_32824711的博客 3186

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号-串联端接

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑并且进行串联端接,以下图为例,准备好发送接收端的IBIS模型, (se_example.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(W1_welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 338

Linux多线程之互斥锁pthread_mutex_t

在多线程编程中,往往会通过全局变量或类变量之类来进行线程间共享,以达到数据共享的便利性,但这也引入了共享资源被多个线程同时写时 引起的资源不同步的问题,这时就需要使用互斥锁pthread_mutex_t来解决这个问题。 1.pthread_mutex_t介绍 1.1互斥锁的创建 锁既可以动态创建也可以静态创建。 1)静态创建: pthread_mutex_t mutex

chenchuanhai04的博客 1319

BevFusion (1): 传感器介绍

激光雷达,也称光学雷达(LIght Detection And Ranging)是激光探测与测距系统的简称,它通过测定传感器发射器与目标物体之间的传播距离,分析目标物体表面的反射能量大小、反射波谱的幅度、频率和相位等信息,从而呈现出目标物精确的三维结构信息。激光雷达是自动驾驶车辆的关键传感器,如下图所示,车辆上方旋转的圆柱体对应就是激光雷达传感器。

@bangbang的博客 1475

图注意力网络(GAT)原理与代码实战案例讲解

1. 背景介绍 图注意力网络(Graph Attention Network,简称GAT)是一种基于图神经网络(Graph Neural Networks,简称GNN)的深度学习方法。它能够处理具有复杂关系的节点数据,并在多个领域取得了显著的效果,如社交网络分析、推荐系统等。 2. 核心概念与联系

AI架构师小马 2712

嵌入式 Linux线程中互斥锁pthread_mutex_t小结

linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义,加锁(lock)后,别人就无法打开,只有当锁没有关闭(unlock)的时候才能访问资源。 它主要用如下5个函数进行操作。 1:pthread_mutex_init(pthread_mutex_t * mutex,const

skdkjxy的专栏 1256

【AI智能体】最强AI编程利器 Claude Code 从部署到项目实战详解

最强AI编程利器 Claude Code 从部署到项目实战详解

congge 4511

linux线程-互斥锁pthread_mutex_t

在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。   一,锁的创建     锁可以被动态或静态创建,可以用宏PTHREA

ZYX的专栏 618

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

linux 互斥锁销毁_Linux线程-互斥锁pthread_mutex_t

在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务; 互斥锁的使用过程中,主要有 pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock 这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。一,锁的创建锁可以被动态或静态创建,可以用宏PTHREAD_MUTEX_...

weixin_39584405的博客 624

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

互斥锁pthread_mutex_init()函数

互斥锁pthread_mutex_init()函数 linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义,加锁(lock)后,别人就无法打开,只有当锁没有关闭(unlock)的时候才能访问资源。 即对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 使用互斥锁(互斥)可以使线程按顺序执行。通常,互

择一事终一生 1298

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Linux线程-互斥锁pthread_mutex_t应用

锁的应用 /* ************************************************************************  *       Filename:  m_mutex.c  *    Description:   *        Version:  1.0

tanqiuwei的专栏 4058
上一篇: GNU Bison 中文手册
下一篇: Bison-Flex 笔记
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值