linux下线程同步之互斥锁

linux环境下线程间通信之互斥锁和条件变量 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而互斥锁、条件变量,主要关注线程间通信。本文只介绍线程间的通信方式。 一、互斥锁 1.1 互斥锁作用 在编程中,对象互斥锁用来保证共享数据操作的完整性。每个对象都对应于一个可称为"互斥锁" 的标记,这个标记用来保证在某个时刻,只能有一个线程访问该对象。 1.2 互斥锁介绍 互斥锁是使用加锁的方法来控制对共享资源的访问。互斥锁有两种状态:上锁( lock )和解锁( unlock )。 互斥锁使用方法: . 阅读详情

  互斥锁是多线程同步的一种方式,当多个线程访问同一个变量时,最简单的方法就是使用一个互斥锁(mutex)保护这个共享变量,防止出现资源抢占的问题。

下面是未加互斥锁时:

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

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;	//静态初始化锁

int n=0;	//共享变量

void* func1(void *arg)
{
	int i;
	for(i=0;i<15;i++)
	{
		//pthread_mutex_lock(&mutex);    //上锁
		n++;
		printf("func1 is=%d\n",n);
		//pthread_mutex_unlock(&mutex);  //解锁
	}
	pthread_exit(NULL);
}

void* func2(void *arg)
{
	int i;
	for(i=0;i<15;i++)
	{	
		//pthread_mutex_lock(&mutex);
		n++;
		printf("func2 is=%d\n",n);
		//pthread_mutex_unlock(&mutex);
	}
	pthread_exit(NULL);
}

int main()
{
	pthread_t t1,t2;

	pthread_create(&t1,NULL,func1,NULL);
	pthread_create(&t2,NULL,func2,NULL);

	pthread_join(t1,NULL);	
	pthread_join(t2,NULL);	

	return 0;
}

​

输出结果:

可以看到,16以后输出了3,并未按照预想的顺序输出。

加锁后的输出:

输出符合预期,没有出现资源抢占的现象。在for循环中频繁的加锁与解锁是不合理的,但是此处是为了测试多线程的资源抢占问题,可以暂时忽略效率。

接下来总结一下多线程另一种同步方式-条件变量的使用。

Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(11) linux下线程同步/互斥方式有哪些? 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。面试基本不会考察接口使用,更侧重会实现原理。 文章目录一、互斥锁二、条件变量(cond)三、信号量(sem)四、理解PV操作问题汇总 一、互斥锁 通过锁机制实现线程间的同步。 初始化锁 在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。 静态分配:pthread_mutex_t mutex = PTHREAD_M 阅读详情

相关推荐

python sci sci-hub 爬论文

sci-hub 爬虫 后续加入对于时间的排序,下载最新文献 参考: https://www.guanjihuan.com/archives/6846 https://blog.youkuaiyun.com/czh2637750821/article/details/115508922

weixin_42783619的博客 3542

shell脚本互斥锁

脚本防止同时运行两个实例的互斥锁以下是主要写法。# 检查锁文件是否存在,如果存在表示系统中有其他实例在运行,则直接退出。 # 需要注意的是,锁文件需要避免重名,建议脚本名称.file [ -f /tmp/lock.file ] &amp;&amp; exit # 开始执行任务前,创建锁文件,并把当前pid 写入锁文件 echo $$ &gt; /tmp/lock.file sleep 1 # 判...

HanJiezZ的博客 3904

飞牛Docker部署Zerotier后无法访问?三步搞定SSH权限配置!

本文详细解析了在飞牛NAS上通过Docker部署Zerotier后无法访问的常见问题及解决方案。重点介绍了SSH权限配置、tun模块加载和Docker容器权限设置等关键步骤,帮助用户快速解决虚拟网络接口的权限问题,确保Zerotier节点间的正常通信。

qq_27496129的博客 788

Shell脚本互斥设置

  参考:https://blog.youkuaiyun.com/hanjiezz/article/details/79571703   shell脚本为了防止同时执行相同的脚本需要设置互斥锁   简单方法,脚本执行开始生成一个锁文件,如果该锁文件存在则代表有人在执行,就退出脚本   test.sh #!/bin/bash LOCKFILE="/tmp/test_lock" if [...

abtmh02622的专栏 452

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 664

LoRA 完整解析:从理论到实践

LoRA(低秩适应)是一种高效的大模型微调方法,通过添加少量可训练参数(低秩矩阵)来适配新任务,避免全参数微调的高成本。其核心是将权重更新ΔW分解为两个小矩阵B×A的乘积,大幅减少训练参数量(仅0.1-1%)。LoRA基于内在维度假设,通过低秩约束捕捉核心任务信息,兼具效率与效果。实际应用中,常用配置为秩r=16-32,目标模块选择注意力层的q_proj和v_proj,学习率比全参数微调大10倍(约1e-4)。优势包括参数高效(内存降低60-80%)、多任务适配灵活、保留预训练知识等,已成为大模型微调的主流

echo的博客 1410

Linux shell 脚本互斥同步

在Linux shell中当两个脚本需要同时访问同一个文件时,就会出现冲突。对于这种冲突可以使用flock命令解决。 flock的加锁和解锁方法如下: 加锁: exec 3>filename # open a file handle; this part will always succeed flock -x 3 # lock the file handle; this part

smile的专栏 3890

YOLOv11改进 - C3k2融合 | C3k2融合融合WDBB宽度多样分支模块(Width Diverse Branch Block)通过多尺度分支增强特征表征能力

本文着眼于灰度图像目标检测所面临的挑战,提出了增强型目标检测网络 YOLO - MIF,该网络整合了多种多信息融合策略以对 YOLOv8 网络进行改进。文章开篇介绍了一种可创建伪多通道灰度图像的技术,此技术能增加网络的通道信息,同时缓解潜在的图像噪声与虚焦模糊问题。随后运用网络结构重新参数化技术,在不增加推断时间的情况下提升网络的检测性能。此外,引入了一种新颖的解耦式检测头,增强了模型处理灰度图像时的表现能力。

魔改工程师的博客 770

shell脚本单实例互斥

##shell执行脚本单实例互斥问题 比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,如果出现意外,运行时间过长, 很有可能下一个备份周期已经开始了,当前周期的脚本却还没有运行完,显然我们都不愿意看到这样的情况发生。其实只要对脚本自身做一些改动,就可以避免它被重复运行。   #!/bin/bash LOCK_NAME="/tmp/my.lock" if

jsyxcjw的专栏 3021

【AI编程】Trae 环境搭建与配置从使用到项目实战详解

Trae 环境搭建与配置从使用到项目实战详解

congge 5650

YOLOV12融合MSDA多尺度空洞注意力:突破尺度限制的科研实践指南

MSDA通过多尺度空洞注意力的设计,为YOLOV12突破尺度检测瓶颈提供了有效方案。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决实际问题”的具体实践。如果你在实验中发现某类尺度目标的检测仍有不足,可以尝试结合数据增强(如随机缩放、多尺度训练)来强化模型对尺度变化的鲁棒性。科研的价值在于不断解决真实难题,希望这份指南能真正帮你在目标检测的尺度感知领域找到新的突破点,祝你在科研探索中持续收获新的见解与成果。

FJN110的博客 240

Linux多线程(2)线程安全(同步与互斥)

线程安全(同步与互斥)原理学习,与代码详解

weixin_59215611的博客 606

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

linux下线程的同步与互斥-互斥锁

linux下线程的同步与互斥-互斥锁

hqb_newfarmer的博客 208

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux下线程同步问题中的互斥锁和条件变量

我们知道多个线程之间有很多内存资源都是共享的,灵活的同时也会造成一些问题,就是当两个线程都要使用同一个资源的时候,例如两个线程同时对一个全局变量进行赋值然后打印,就会出现同步问题,有可能 线程2打印出来的结果实际上是线程1对其赋的值.因此,Linux提供了几种方法用来解决多线程同步问题,在这里主要探究一下互斥锁和条件变量之间的瓜葛.先简单的说一下互斥锁:互斥锁是通过锁机制来实现线程间同步的一种方法.

Hello 刘付杰 548

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux下线程同步(带你了解什么是互斥锁、死锁、读写锁、条件变量、信号量等)

假设有四个线程A、B、C、D,当前一个线程A对内存中的**共享资源**进行访问的时候,其他线程B、C、D都不可以对这块内存进行操作,直至A对这块内存访问完毕为止,B、C、D中的一个才能访问这块内存,剩余的俩个需要继续阻塞等待,一次类推,直到所有的线程都对这块内存操作完毕。线程对内存的这种访问方式称为线程同步,**所谓的现成的同步并不是多个线程同时对内存访问,而是按照先后顺序依次进行的。**......

林夕07 836

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux下线程的同步:互斥锁、自旋锁、读写锁、原子操作(进程也可用原子操作)

1、多线程中的i++问题 我们来看一个经典的多线程i++出现的问题 /*================================================================ * Copyright (C) 2021 baichao All rights reserved. * * 文件名称:iaddadd.cpp * 创 建 者:baichao * 创建日期:2021年04月01日 * 描 述: * ====================.

李白 1068

linux下线程同步的几种方法

Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。一、互斥锁(mutex)   锁机制是同一时刻只允许一个线程执行一个关键部分的代码。 1. 初始化锁   int pt...

FML7169的博客 303

Linux下线程同步的几种方法

Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 一、互斥锁(mutex)   锁机制是同一时刻只允许一个线程执行一个关键部分的代码。  1. 初始化锁   int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);    其中参数 mut

jkx01whg的专栏 1万+

线程同步的几种方法

线程同步的几种方法

Lijueqi001的博客 1785

Linux下线程同步机制(吐血整理)

线程同步资源竞争线程同步1. 互斥锁2. 读写锁3. 自旋锁4. 信号量5. 条件变量6. 屏障 资源竞争 当进程中的多个线程,同时读取一块内存数据,与此同时其中一个或多个线程修改了这块内存数据。这样就会导致不可预期的结果 因为线程不安全引起的错误往往非常难发现,因为这种现象是不能稳定复现的。 下面举个例子: #include <stdio.h> #include <string.h> #include <pthread.h> int g = 0; //1000000

LUCAS004的博客 3396

linux中实现线程同步的6种方法

linux线程同步的方法 下面是一个线程不安全的例子: #include<stdio.h> #include<pthread.h> int ticket_num=10000000; void *sell_ticket(void *arg) { while(ticket_num>0) { ticket_num--; } } int main() { pthread_t t1,t2,t3; pthread_create(&t1, NU

morris 4万+

Linux:线程同步之互斥锁(互斥锁的本质、互斥锁的作用、如何使用互斥锁实现线程同步)

Linux:线程同步之互斥锁(互斥锁的本质、互斥锁的作用、如何使用互斥锁实现线程同步);pthread_mutex_init、pthread_mutex_lock、pthread_mutex_lock、pthread_mutex_unlock、pthread_mutex_destroy等

qq_42279379的博客 727

Linux下线程的同步与互斥

开头我们来写一个简单的程序,实现用多线程的方式来抢票,代码如下:运行完结果后发现,我这只有一万张票,在if条件判断里我也做了判断,怎么会干到-2来了呢?运用线程的理论知识我们知道,ticketnum在线程中属于共享资源,它不具有原子性,在我们需要对变量进行减减的时候,内存会将变量存入cpu中减减,然后再把减完后的内容写入内存里三步,

pouop的博客 811

Linux 线程同步-条件变量和互斥锁开发实例

Linux 线程条件变量和互斥锁开发实例代码执行结果 代码 main.c #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;pthread.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;stdlib.h&amp;

taoxp123456的博客 275
上一篇: linux下多线程的创建和结构体传参
下一篇: linux下线程同步之条件变量
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值