linux多线程编程之线程安全mutex锁的使用

linux-内核锁 目录: 一、铺垫知识 1、指令执行流 2、上下文 3、抢占 二、内核锁基础知识 1、为什么要用锁?why 2、锁保护什么?what 3、锁是如何保护资源的?How 三、各类锁的介绍 1、原子操作 2、spinlock 3、mutex 4、… 进程指令执行流 代码在CPU上执行的指令数据流,由一系列代码组成。可分为两大类:线程维度和中断维度 1、cpu只要上电,就需要不停的执行指令,永不停歇,若无事可做,那就执行空指令,直到下电。cpu类似一个跑道,各个task轮流到跑 阅读详情

由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好!

所以改成多线程了,但是一直没有用mutex,出现了不少段错误。我觉得势必和资源共享有许多关系!

本来线程安全 的 资源共享 我觉得 用个变量来控制就行,比如

int lock_x=0;

在线程中

if(lock_x==1) usleep(20);//休息20毫秒 、、这里我还害怕死循环呢

lock_x=1;

//do change of x

lock_x=0;

这样看起来好,实际上也不咋样吧。pthread_mutex(看参考资料1)我早就知道,但是不知具体用法,其实用法比上面的要简单,而且可以少写一句话,而且肯定比我的线程数据安全了。

我就写个例子吧。多线程的 共享资源修改示例:

复制代码
/*
============================================================================
Name : mutex_test.c
Author : ayanmw
Version :
Copyright : CopyRight ptopn.com
Description : Hello World in C, Ansi-style
============================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
int x=0;
pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER;
void *client(int *data){
pthread_mutex_lock(&mutex_x);
fprintf(stdout,"%d:mutex_lock\n",data);
x++;
fprintf(stdout,"%d:mutex 正在修改x的值:%d\n",data,x);
sleep(1);
pthread_mutex_unlock(&mutex_x);
fprintf(stdout,"%d:mutex_unlock\n",data);

}
int main(void) {
int i=1;
pthread_t threadInfo;
pthread_attr_t threadInfo_attr;

pthread_create(&threadInfo,NULL,client,(void *)1);
pthread_create(&threadInfo,NULL,client,(void *)2);
pthread_create(&threadInfo,NULL,client,(void *)3);

pthread_join(threadInfo,NULL);
//fprintf(stdout,"Hi");
return EXIT_SUCCESS;
}
复制代码

运行结果如下:

复制代码
2:mutex_lock
2:mutex 正在修改x的值:1//此处停留1s
2:mutex_unlock
3:mutex_lock
3:mutex 正在修改x的值:2//此处停留1s
3:mutex_unlock
1:mutex_lock
1:mutex 正在修改x的值:3//此处停留1s
复制代码

前面的数字 因为情况不同,也会顺序有变化的,如果把mutex_lock And Unlock 去掉,运行结果是这样子的:

复制代码
2:mutex_lock
2:mutex 正在修改x的值:1
1:mutex_lock
3:mutex_lock
3:mutex 正在修改x的值:2
1:mutex 正在修改x的值:3
2:mutex_unlock
3:mutex_unlock
1:mutex_unlock
复制代码

注意:我的程序编译会报警告,因为我把int直接 当 指针传递,使用不能用 *data的。因为灵活变通嘛,我才这样写。实际还要要规范下代码的!

上面的示例程序,实际情况是一个socket服务器,没接收到一个客户端连接,就建立一个线程,进行连接。本身继续监听。客户端 单线程。

 


参考资料:Linux多线程编程的高效开发经验:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

ubuntu man手册

ubuntu自带的man不全,需要安装

           manpages
           manpages-zh  //这个我认为没必要进行设置,安装即可用。但是这个是一些常用的中文man,而不是全部。man bind 会显示中文,看起来舒服多了。如果man中文计划全部翻译就好了。
           manpages-dev
           libstdc++6-4.4-doc
           manpages-posix
           manpages-posix-dev

这个可以根据apt-get install manpages- 按tab会显示可安装的软件包(ubuntu的这个设置太方便了,好用)。

通过man -k thread/man -k pthread /man -k pthread_mutex /man -k pthread_cond

Linux内核基础 - mutex_lock 函数的详解 kernel 同步互斥 mutex 中断 阅读详情

相关推荐

Linux内核中mutex,spinlock的使用

并发性的,在CPU1线程B获取锁B,同时想获取锁A,导致AB-BA死锁。锁的粒度:在大项目中,使用太少的锁是个问题。锁A发生在中断上下文中:如果中断发生,中断处理函数尝试获取锁A,导致死锁。因此,在中断上下文中获取的锁必须始终在禁用中断的情况下使用。mutex lock 是睡眠锁,在等待锁时将睡眠,再锁被释放后,内核唤醒等待的进程运行;此外,不可中断状态的睡眠更多一些,必须无限期阻塞等待,任务不能打断阻塞的等待。在人机交互应用程序中,一般的经验,通常应该将进程置于可中断的睡眠状态。

3843

互斥锁(mutex lock)

互斥锁与自旋锁的关系, 以及需要注意的事项

活到老学到老 5913

多租户Saas架构设计分析(基础篇)

本篇先给大家介绍一下相关的概念和常见问题。 实践篇链接:https://blog.youkuaiyun.com/haponchang/article/details/104246317 SaaS简介 SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式。...

haponchang的博客 1万+

浅谈Mutex (Lock)

Mutex(又叫 Lock),在多线程中,作为同步的基本类型,用来保证没有两个线程或进程同时在他们的关键区域.因为 Mutex 这种排它性,很多人认为 Mutex 开销很大,尽量避免使用它.就如这篇分析完共享数据问题后,进一步分析说明Avoiding locks来解决这个问题.但 Mutex 真的开销如此大,还是被大家误解了?Matthew Dillon写道,”Most people have the misconception that locks are slow.”, Jeff Preshing...

木牛的博客 2万+

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

【FPGA】Verilog代码实现温湿度传感器DHT11

#今天也是咸鱼的一天~ 因为参加Robei 杯 是要做一个机器人,先不说这个机器人具体怎么机器法,但是和外界互通的传感器肯定少不了,通过获取外界环境数据,进行处理,然后做出各种各样的功能。 先来讲个简单的模块,温湿度传感器DHT11。 DHT11介绍 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。它具有超小体积、极低功耗的特点。它使用单根总线与单片机进行双向的串行数据传输,信号传...

Ninquelote的博客 9162

linux多线程编程之线程安全 mutex锁的使用

由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好! 所以改成多线程了,但是一直没有用mutex,出现了不少段错误。我觉得势必和资源共享有许多关系! 本来线程安全 的 资源共享 我觉得 用个变量来控制就行,比如 int lock_x=0; 在线程中 if(lock_x==1) usleep(20);//休息...

weixin_34019929的博客 737

Android12 车载开发TaskView实现分屏

这里只给出TaskView的代码,相关联的源码,请看源码,如果想要使用TaskView需要自己去编译frameWork的源码,打包一个aar,或者jar出来使用,否则无法直接使用。1.如果分屏的应用如启动两个应用按照权重占比,互相不叠加在一起,点触摸击事件都可响应,例如左边启动QQ了,右边启动的是微信,二者窗口都可操作。TaskView是谷歌整合安卓多任务多窗口下交互重新重构的独立出来的module,本身继承自ServiceView,TaskView的相关概念性的东西参考。//创建的taskview。

android_bird_bird的博客 9550

Linux操作系统——多线程互斥

我们已经学习了什么是多线程,以及多线程的控制和其优点,多线程可以提高程序的并发性和运行效率,可以充分利用计算机的多核资源。但是我们在前面学习的过程中,看到了有些多线程的程序的运行结果是有一些问题的,如出现了输出混乱、访问共享资源混乱等特点。所以我们下面提出的这个概念是关于这方面的——线程互斥。

学习日记 956

U盘安装单系统ubuntu10.04之全过程&拔掉U盘后系统无法启动

借助U盘把电脑装成ubuntu单系统之过程记录,以及遇到拔掉U盘后系统无法启动问题,电脑就显示: Non-System disk or disk error, replace and strike any key when ready

CXHPLY的专栏 8680

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

Linux线程安全

文章目录Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常见的线程安全的情况常见的不可重入的情况常见的可重入的情况可重入与线程安全联系可重入与线程安全区别常见锁概念死锁死锁的四个必要条件避免死锁Linux线程同步条件变量同步概念与竞态条件条件变量函数为什么pthread_cond_wait需要互斥量条件变量使用规范 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 互斥量实现原理探究 可重

2021dragon的博客 1万+

YOLOv11改进 | Conv篇 | 2024最新轻量化自适应提取模块LAE助力边缘设备部署计算(附代码 + 修改教程 + 运行教程)

本文给大家带来的一个改进机制是最新由LSM-YOLO提出的轻量化自适应特征提取(Lightweight Adaptive Extraction, LAE)模块,其是LSM-YOLO模型中的关键模块,旨在进行多尺度特征提取,同时降低计算成本。LAE通过以下方式实现更有效的特征提取:多尺度特征提取、自适应特征提取。LAE模块可以在不增加额外参数的情况下提高了模型对ROI区域的检测性能。​欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍。

Snu77的博客 4055

【Linux】多线程2——线程互斥与同步/多线程应用

多线程的互斥与同步,以及多线程的一些应用场景

Pursue quality, not quantity. 783

2026华为OD机试(JAVA&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Java实现。

MISAYAONE的博客 34万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pthread_mutex_t 究竟有什么花样?

自己动手画了个图,一张图胜过1000行注释。

又见南风的博客 344

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux系统互斥锁:pthread_mutex_init, pthread_mutex_lock等函数详解

特性互斥锁读写锁并发性完全互斥读共享,写互斥性能读写均需排队读操作可并发,性能更优适用场景读写操作频率相当读多写少场景复杂度简单相对复杂开销较小较大实现二进制状态需要维护读者计数参考答案:互斥锁是一种用于多线程编程的同步机制,用于保护共享资源,防止多个线程同时访问造成的数据不一致问题。它确保在任何时刻只有一个线程可以进入临界区执行代码。参考答案:死锁是指两个或多个线程互相等待对方释放锁而无法继续执行的情况。避免方法:按固定顺序获取锁。

2301_78626750的博客 1161

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux 之 【多线程】(互斥、互斥锁、pthread_mutex_XXX,可重入与线程安全)

4. 初始化位置限制:只能在声明时初始化。

zl_dfq的博客 733

Linux之【多线程】线程互斥(锁)&线程同步(条件变量)

本文主要向读者们讲解一下linux系统下线程互斥与线程安全方面的知识,图文并茂,讲解详细;涉及知识面有互斥、同步、互斥锁、条件变量、原子性操作等等,想了解linux线程的小伙伴务必来阅读一番

m0_54469145的博客 864

【Linux】线程互斥与互斥量全解析:原理、实践与封装

本文围绕多线程并发访问临界资源的数据不一致问题展开,先阐述线程互斥核心概念,再通过抢票案例剖析并发问题根源,详细介绍 pthread 互斥量接口使用,深入解析互斥的硬件与软件实现原理,最后给出互斥锁的 RAII 风格面向对象封装方案,助力读者全面理解线程互斥机制及实践应用。

2501_90265152的博客 1509

【Linux操作系统】简学深悟启示录:线程同步与互斥

本文展示了一个多线程抢票系统的实现,通过模拟5个线程并发访问共享变量tickets=1000,揭示了多线程环境下数据竞争的问题。文章详细分析了线程互斥的概念,包括临界资源、临界区和互斥锁的使用方法。通过引入pthread_mutex_t互斥锁机制,解决了数据混乱问题,保证了线程安全。同时探讨了互斥锁的原理,解释了CPU通过swap/exchange指令实现原子操作的过程,以及单核CPU环境下线程通过上下文切换实现逻辑隔离的机制。最后指出互斥锁虽然解决了数据竞争,但可能引发线程饥饿问题,需要合理设计锁的使用策

Zero_VPN的博客 1万+

【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解

小结一下:线程 A 将。

2501_93351213的博客 419

并发(锁)

获取自旋锁时,如果发现自旋锁已经被其他线程持有,则当前线程会一直处于忙等状态,直到自旋锁被释放为止。因为自旋锁不涉及内核态切换,所以相较于互斥锁而言,可以避免系统调用的开销,在保护小型临界区时效率更高。因为 count是一个线程共用的临界资源所以需要对其加锁 使得在线程1调用count的时候线程2无法调用 效果类似于sql的锁 在调用前加锁 调用完成后解锁。但事实上 在执行线程1的过程中(未执行完线程1的指令) 插入线程2的指令 导致程序同一个数重复执行。类似于while(1);课后了解 CAS技术。

qq_43384388的博客 103

pthread_mutex的使用

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

stone-jin 2672

Linux - 线程的同步与互斥

线程互斥通过互斥量(mutex)解决竞态条件,需规范初始化、加锁解锁及临界区界定。条件变量配合互斥量使用,需处理虚假唤醒问题。 生产者-消费者模型可采用阻塞队列或环形队列,条件变量适用于复杂同步,信号量适合简单资源计数。 线程池优化线程创建开销。线程安全与可重入性区别在于共享数据访问方式。死锁需满足互斥、占有等待、非抢占和循环等待四条件。锁类型包括互斥锁、读写锁、自旋锁等,各有适用场景

2301_80772499的博客 1204

【Linux】线程同步与互斥

介绍线程的互斥与同步,锁的概念

dab112的博客 606
上一篇: explicit构造函数
下一篇: 内核锁 spin_lock 与 mutex_lock 区别? -- linux内核
青松愉快
博客等级 码龄14年 71粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值