Linux 详谈线程同步与互斥

Linux——线程互斥与同步 Linux线程互斥与同步详解!!! 阅读详情

目录

1. 线程互斥

进程线程间的互斥相关背景概念

互斥量mutex

互斥量实现原理探究

互斥量的封装

2. 线程同步

条件变量

同步概念与竞态条件

条件变量函数


1. 线程互斥

进程线程间的互斥相关背景概念

临界资源:多线程执⾏流共享的资源就叫做临界资源

临界区:每个线程内部,访问临界资源的代码,就叫做临界区

互斥:任何时刻,互斥保证有且只有⼀个执⾏流进⼊临界区,访问临界资源,通常对临界资源起保护作⽤

原⼦性(后⾯讨论如何实现):不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成

互斥量mutex

⼤部分情况,线程使⽤的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程⽆法获得这种变量。

但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。

多个线程并发的操作共享变量,会带来⼀些问题。

// 操作共享变量会有问题的售票系统代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
int ticket = 100;

void* route(void* arg)
{
	char* id = (char*)arg;
	while (1) {
		if (ticket > 0) {
			usleep(1000);
			printf("%s sells ticket:%d\n", id, ticket);
			ticket--;
		}
		else {
			break;
		}
	}
}
int main(void)
{
	pthread_t t1, t2, t3, t4;
	pthread_create(&t1, NULL, route, "thread 1");
	pthread_create(&t2, NULL, route, "thread 2");
	pthread_create(&t3, NULL, route, "thread 3");
	pthread_create(&t4, NULL, route, "thread 4");
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	pthread_join(t3, NULL);
	pthread_join(t4, NULL);
}
⼀次执⾏结果:
thread 4 sells ticket:100
...
thread 4 sells ticket:1
thread 2 sells ticket:0
thread 1 sells ticket:-1
thread 3 sells ticket:-2

为什么可能⽆法获得争取结果?

if 语句判断条件为真以后,代码可以并发的切换到其他线程

usleep 这个模拟漫⻓业务的过程,在这个漫⻓的业务过程中,可能有很多个线程会进⼊该代码段

--ticket 操作本⾝就不是⼀个原⼦操作

取出ticket--部分的汇编代码
objdump -d a.out > test.objdump
152 40064b: 8b 05 e3 04 20 00 mov 0x2004e3(%rip),%eax #600b34 <ticket>
153 400651: 83 e8 01 sub $0x1,%eax
154 400654: 89 05 da 04 20 00 mov %eax,0x2004da(%rip) #600b34 <ticket>

-- 操作并不是原⼦操作,⽽是对应三条汇编指令:

load :将共享变量ticket从内存加载到寄存器中

update : 更新寄存器⾥⾯的值,执⾏-1操作

store :将新值,从寄存器写回共享变量ticket的内存地址

要解决以上问题,需要做到三点:

代码必须要有互斥⾏为:当代码进⼊临界区执⾏时,不允许其他线程进⼊该临界区。

如果多个线程同时要求执⾏临界区的代码,并且临界区没有线程在执⾏,那么只能允许⼀个线程进⼊该临界区。

如果线程不在临界区中执⾏,那么该线程不能阻⽌其他线程进⼊临界区。

要做到这三点,本质上就是需要⼀把锁。Linux上提供的这把锁叫互斥量。

互斥量的接⼝

初始化互斥量

初始化互斥量有两种⽅法:

⽅法1,静态分配:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

⽅法2,动态分配:

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrictattr);
参数:
    mutex:要初始化的互斥量
    attr:NULL

销毁互斥量

销毁互斥量需要注意:

使⽤ PTHREAD_ MUTEX_ INITIALIZER 初始化的互斥量不需要销毁

不要销毁⼀个已经加锁的互斥量

已经销毁的互斥量,要确保后⾯不会有线程再尝试加锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

互斥量加锁和解锁

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值:成功返回0,失败返回错误号

调⽤ pthread_ lock 时,可能会遇到以下情况:

互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功

发起函数调⽤时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量,那么pthread_ lock调⽤会陷⼊阻塞(执⾏流被挂起),等待互斥量解锁。

改进上⾯的售票系统:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
int ticket = 100;
pthread_mutex_t mutex;
void* route(void* arg)
{
	char* id = (char*)arg;
	while (1) {
		pthread_mutex_lock(&mutex);
		if (ticket > 0) {
			usleep(1000);
			printf("%s sells ticket:%d\n", id, ticket);
			ticket--;
			pthread_mutex_unlock(&mutex);
			// sched_yield(); 放弃CPU
		}
		else {
			pthread_mutex_unlock(&mutex);
			break;
		}
	}
}
int main(void)
{
	pthread_t t1, t2, t3, t4;
	pthread_mutex_init(&mutex, NULL);
	pthread_create(&t1, NULL, route, "thread 1");
	pthread_create(&t2, NULL, route, "thread 2");
	pthread_create(&t3, NULL, route, "thread 3");
	pthread_create(&t4, NULL, route, "thread 4");
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	pthread_join(t3, NULL);
	pthread_join(t4, NULL);
	pthread_mutex_destroy(&mutex);
}

互斥量实现原理探究

经过上⾯的例⼦,⼤家已经意识到单纯的 i++ 或者 ++i 都不是原⼦的,有可能会有数据⼀致性问题

为了实现互斥锁操作,⼤多数体系结构都提供了swap或exchange指令,该指令的作⽤是把寄存器和内存单元的数据相交换,由于只有⼀条指令,保证了原⼦性,即使是多处理器平台,访问内存的 总线周期也有先后,⼀个处理器上的交换指令执⾏时另⼀个处理器的交换指令只能等待总线周期。 现在我们把lock和unlock的伪代码改⼀下

互斥量的封装

-- Lock.hpp --

#pragma once
#include <iostream>
#include <string>
#include <pthread.h>
namespace LockModule
{
	// 对锁进⾏封装,可以独⽴使⽤
	class Mutex
	{
	public:
		// 删除不要的拷⻉和赋值
		Mutex(const Mutex&) = delete;
		const Mutex& operator =(const Mutex&) = delete;
		Mutex()
		{
			int n = pthread_mutex_init(&_mutex, nullptr);
			(void)n;
		}
		void Lock()
		{
			int n = pthread_mutex_lock(&_mutex);
			(void)n;
		}
		void Unlock()
		{
			int n = pthread_mutex_unlock(&_mutex);
			(void)n;
		}
		pthread_mutex_t* GetMutexOriginal() // 获取原始指针
		{
			return &_mutex;
		}
		~Mutex()
		{
			int n = pthread_mutex_destroy(&_mutex);
			(void)n;
		}
	private:
		pthread_mutex_t _mutex;
	};
	// 采⽤RAII⻛格,进⾏锁管理
	class LockGuard
	{
	public:
		LockGuard(Mutex& mutex) :_mutex(mutex)
		{
			_mutex.Lock();
		}
		~LockGuard()
		{
			_mutex.Unlock();
		}
	private:
		Mutex& _mutex;
	};
}
// 抢票的代码就可以更新成为
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "Lock.hpp"
using namespace LockModule;
int ticket = 1000;
Mutex mutex;
void* route(void* arg)
{
	char* id = (char*)arg;
	while (1)
	{
		LockGuard lockguard(mutex); // 使⽤RAII⻛格的锁
		if (ticket > 0)
		{
			usleep(1000);
			printf("%s sells ticket:%d\n", id, ticket);
			ticket--;
		}
		else
		{
			break;
		}
	}
	return nullptr;
}
int main(void)
{
	pthread_t t1, t2, t3, t4;
	pthread_create(&t1, NULL, route, (void*)"thread 1");
	pthread_create(&t2, NULL, route, (void*)"thread 2");
	pthread_create(&t3, NULL, route, (void*)"thread 3");
	pthread_create(&t4, NULL, route, (void*)"thread 4");
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	pthread_join(t3, NULL);
	pthread_join(t4, NULL);
}
RAII⻛格的互斥锁, C++11也有,⽐如:
std::mutex mtx;
std::lock_guard<std::mutex> guard(mtx);
此处我们仅做封装,⽅便后续使⽤

2. 线程同步

条件变量

当⼀个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。

例如⼀个线程访问队列时,发现队列为空,它只能等待,只到其它线程将⼀个节点添加到队列中。这种情况就需要⽤到条件变量

同步概念与竞态条件

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从⽽有效避免饥饿问题,叫做同步

竞态条件:因为时序问题,⽽导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解

条件变量函数

初始化

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrictattr);
参数:
    cond:要初始化的条件变量
    attr:NULL

销毁

int pthread_cond_destroy(pthread_cond_t *cond);

等待条件满⾜

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrictmutex);
参数:
cond:要在这个条件变量上等待
mutex:互斥量,后⾯详细解释

唤醒等待

int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

简单案例:

我们先使⽤PTHREAD_COND/MUTEX_INITIALIZER进⾏测试,对其他细节暂不追究

然后将接⼝更改成为使⽤ pthread_cond_init/pthread_cond_destroy 的⽅式,⽅便后续进⾏封装

#include <iostream>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* active(void* arg)
{
	std::string name = static_cast<const char*>(arg);
	while (true) {
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&cond, &mutex);
		std::cout << name << " 活动..." << std::endl;
		pthread_mutex_unlock(&mutex);
	}
}
int main(void)
{
	pthread_t t1, t2;
	pthread_create(&t1, NULL, active, (void*)"thread-1");
	pthread_create(&t2, NULL, active, (void*)"thread-2");
	sleep(3); // 可有可⽆,这⾥确保两个线程已经在运⾏
	while (true)
	{
		// 对⽐测试
		// pthread_cond_signal(&cond); // 唤醒⼀个线程
		pthread_cond_broadcast(&cond); // 唤醒所有线程
		sleep(1);
	}
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
}
$ ./cond
thread-1 活动...
thread-2 活动...
thread-1 活动...
thread-1 活动...
thread-2 活动...
Linux下的多线程编程二(线程的同步与互斥) 一、什么叫做线程的同步与互斥?为什么需要同步与互斥? 二、互斥量 三、条件变量 四、信号量 五、读写锁 阅读详情

相关推荐

Linux 线程互斥与同步

和 pthread_cond_signal 不同,pthread_cond_signal 只唤醒 一个 等待的线程,而 pthread_cond_broadcast 唤醒 所有等待的线程。:当线程调用 pthread_cond_wait() 时,它会自动释放所持有的互斥锁,并将自己置于等待状态,直到被另一个线程用 pthread_cond_signal() 或 pthread_cond_broadcast() 唤醒。:条件变量的作用是协调线程的执行,确保某些条件为真时,线程才会继续执行。

yuzhebalabala的博客 1317

互斥锁与条件变量详解

一、互斥量和条件变量简介   互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。在互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥锁加锁,其它线程将会看到互斥锁依然被锁住,只能回去再次等待它...

lwz15071387627的博客 1万+

浅谈互斥锁为什么还要和条件变量配合使用

mutex体现的是一种竞争,我离开了,通知你进来。 cond体现的是一种协作,我准备好了,通知你开始吧。 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。 两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加

linux系统编程—线程—互斥锁与条件变量

如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,而返回EBUSY。pthread_mutex_init和pthread_mutex_destroy参数一和通过pthread_mutex_t创建,参数需要的是一个指针。pthread_cond_wait参数一:等待的条件变量(由pthread_cond_t 创建)

2301_77164542的博客 1690

从菜鸟到高手:我的Abaqus壳单元S4R、S3R、S8R选择心路历程

第一次打开Abaqus的单元库时,我被琳琅满目的壳单元类型晃花了眼。S4R、S3R、S8R、STRI65、S9R5...这些看似随意的字母数字组合,背后却隐藏着影响仿真精度的关键密码。作为一名从土木工程转行到汽车结构仿真的工程师,我花了三年时间才真正理解如何根据问题特性精准选择壳单元。这段学习历程充满试错与顿悟,今天就用几个关键案例,分享我的壳单元选择方法论。

weixin_42525637的博客 417

FFT去除频率分量的完整流程与数学分析

重叠与窗口:确保块间无缝过渡,避免幅度跳变;实时缓冲:处理速度需快于数据输入速度,避免断流;DAC的平滑角色:通过数模转换和滤波,将离散样点还原为连续波形。通过这种分段处理+重叠拼接的方法,即使FFT本身处理的是离散数据块,最终DAC输出仍能保持信号的时间连续性。以下是完整的数学分析过程和代码逻辑,演示如何通过FFT去除特定频率成分,并通过去窗技术恢复信号。信号加窗。

林愿留的博客 1609

条件变量和互斥锁的使用

一 条件变量 前面的文章已经讲过互斥锁的使用规则,接下来,我们再来讲一下条件变量。 条件变量其实就是一种通知机制,当某个共享数据到达某个值的时候,通知等待该共享数据到达该值的线程来处理该共享数据。 条件变量一般是用于让生产者线程和消费者线程之间以及消费者线程之间互斥的访问临界资源(临界资源指的是同时只允许一个线程访问的共享资源)。条件变量的使用一般是需要结合互斥锁来进行(条件变量相关函数的输入参数就是互斥锁),从而使得各个线程能够互斥的访问该临界资源。 二 条件变量的使用 条件变量在pthread

qq_40115163的博客 2322

告别手动群发!用IDA Pro和CE搞定企业微信4.1.38.6011的HOOK开发(附完整代码)

本文详细介绍了如何利用IDA Pro和Cheat Engine进行企业微信4.1.38.6011的HOOK开发,实现自动化群发功能。从逆向工程环境配置、关键函数定位到HOOK框架设计,提供完整代码示例,帮助企业提升运营效率。

weixin_42533120的博客 478

07.互斥锁和条件变量

1、 概述 互斥锁和条件变量总是可用来同步一个进程内的各个线程的。如果一个互斥锁或条件变量存放在多个进程间共享的某个内存区中,那么它还可以用于这些进程间的同步。 2、互斥锁:上锁与解锁 互斥锁指代相互排斥(mutual exclusion),它是最基本的同步形式。互斥锁用于保护临界区(critical region), 以保证任何时刻只有一个线程在执行其中的代码(假设互斥锁由多个线程共...

行走 948

STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册

摘要: 本文针对STM32嵌入式开发中LwIP TCP通信的高延迟问题(默认配置下延迟达10~20ms),提出纯软件优化方案,通过调整内存配置与TCP参数将延迟降至1ms。核心问题包括内存池不足、pbuf分配低效及Nagle算法拖累,优化步骤包括: 内存池扩容:增大MEMP_NUM_TCP_PCB至10、PBUF_POOL_SIZE至32,避免资源竞争; pbuf静态池分配:采用2048字节大块缓冲区匹配DMA传输,减少分块与拷贝; 关闭Nagle算法:设置TCP_NODELAY=1,禁用延迟确认以加速小包

weixin_42212753的博客 1707

如何实现MCGS与S7-200SMART PLC以太网多台通信控制?

第九步:(设备工具箱—设备管理—鼠标依次点击通用TCP/IP父设备—西门子_ Smart200到设备窗口里面去)数据类型:第0位(指PLC地址变量小数点后面的位数,例如我地址是M0.0,那么在数据类型应填写通道的第00位)第十步:(鼠标双击打开通用TCPIP父设备0--[通用TCP/IP父设备]进入通信配置)通道地址:0(指小数点前面起始字节的地址,例如我地址是M0.0,那么应在通道地填写0)。第七步:(选择通用TCP/IP父设备,点击新增,右侧选定设备就会自动添加进去。

u010670857的博客 6715

互斥锁、条件变量

一、互斥锁 1. 函数原型: pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_destroy(pthread_mutex_t *mutex); 分析: pthread_mutex_t 类型,其本质是一个结构体,...

月雲之霄的博客 857

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

Linux---详谈线程的同步与互斥,互斥量以及条件变量

大部分情况下,线程使用的都是局部变量,保存在自己的私有栈结构里,但是有的时候又会多线程访问共享资源,如全局变量,这时候如果操作过于频繁,或者线程数量较多,就会产生一些问题,因为毕竟不是所有的操作都是原子性的(要么不做,要么就做完,不存在中间时刻) 下面模拟买票场景,大家看完就会明白问题所在,代码很简单 int ticket = 20;//假设一共有20张票(全局变量) ...

IT_xiaoye的博客 413

RK3568平台(camera篇) mipi csi接口

MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI是差分串口传输,速度快,抗干扰。主流手机模组现在都是用MIPI传输,传输时使用4对差分信号传输图像数据和一对差分时钟信号;MIPI摄像头有三个电源:VDDIO(IO电源),AVDD(模拟电源),DVDD(内核数字电源),不同sensor模组的摄像头供电不同。

weixin_49303682的博客 5345

华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解

华为OD面试高频手撕真题【合并相邻且相等的元素】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 546

【Linux】线程同步与互斥

互斥:用锁(互斥锁、读写锁)保证共享资源的原子访问,避免数据竞争;同步:用条件变量、信号量协调线程执行顺序,满足逻辑依赖;避坑重点:锁必须成对使用,条件变量需处理虚假唤醒,同步逻辑需避免死锁。

2401_86449430的博客 1万+

蓝牙模块HM-10手册

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

Linux线程-互斥与同步

本章主要讲解学习Linux中对多线程的执行中的同步与互斥

~ 1623

假人有限元模型

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Linux】Linux线程互斥与同步

本文介绍了线程互斥与同步,互斥锁,条件变量,可重入与线程安全

qq_67582098的博客 2037

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Linux】线程互斥与同步

文章目录一. 什么是互斥?二. 为什么要有互斥?三. 互斥量实现互斥 一. 什么是互斥? 在介绍什么是互斥之前需要了解下面三个概念: 临界资源:多线程执行流共享的资源就叫做临界资源。 临界区:每个线程内部,访问临界资源的代码,就叫做临界区。 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用 二. 为什么要有互斥? 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程私有栈空间

m0_51064412的博客 4204

【linux线程(二)】线程互斥与线程同步

本篇文章着重讲解了多线程场景下的安全问题以及线程安全和可重入的联系与区别.最后讲解了为了避免造成线程饥饿问题而引进的条件变量,以及接口演示.

杭电码农-NEO的博客 1849

Linux多线程——线程互斥与同步

摘要:多线程并发访问共享资源时存在数据竞争问题,需通过互斥锁和同步机制解决。 临界资源与竞争问题:多线程同时操作全局变量(如g_val--)时,由于CPU指令的非原子性,可能导致数据不一致。例如,线程切换时未完成的操作会使变量值异常。 互斥锁保护:通过pthread_mutex_t实现加锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock),确保临界区代码的原子性。锁的粒度应尽量细以减少性能损失。 线程同步:条件变量(pthread_cond_t)解决线程间执行顺序问题

2401_83603768的博客 1455

【Linux学习】线程互斥与同步

线程互斥,临界资源,互斥锁,死锁问题,避免死锁,多线程编程,临界线程互斥是一种同步机制,用于控制对共享资源的访问,以确保在任意给定的时刻只有一个线程可以访问该资源。在多线程编程中,当多个线程同时竞争访问某个共享资源时,如果没有适当的同步机制,可能会导致竞争条件和数据不一致性的问题。线程互斥通过引入互斥锁等机制,使得在任意时刻只能有一个线程持有资源的访问权限,从而避免了竞争条件和数据不一致性的发生。进程线程间的互斥相关背景概念多线程执行流共享的资源叫做临界资源。每个线程内部,访问临界资源的代码,就叫做临界区。

Chris在Coding的博客 1457

【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制

在当今这个数据驱动、高性能计算盛行的时代,多线程编程已经成为软件开发中不可或缺的一部分。Linux,作为开源世界的领头羊,其强大的多线程支持为开发者提供了广阔的舞台,让高并发、高性能的应用得以实现。然而,多线程编程也是一把双刃剑,它在带来性能提升的同时,也引入了线程安全、资源竞争等复杂问题

EterNity_TiMe_的计算机学习之路 2814

【Linux】线程的同步与互斥

本文深入探讨了线程互斥与同步的概念及其在多线程编程中的应用。首先,文章回顾了互斥的基本概念,包括临界资源、临界区、互斥和原子性,并通过抢票系统的代码示例展示了多线程环境下数据不一致的问题。接着,文章引入了互斥锁(Mutex)的概念,详细介绍了其接口、使用方法以及如何通过加锁机制解决数据竞争问题。此外,文章还探讨了条件变量(Cond)的使用,解释了如何通过条件变量实现线程的同步,避免线程饥饿现象。最后,文章介绍了生产者/消费者模型,并通过阻塞队列(BlockingQueue)的实现展示了如何在实际应用中结合互

2301_81577798的博客 1万+

Linux之线程同步与互斥

Linux之线程同步与互斥

2302_81120572的博客 1584
上一篇: Linux 详谈线程概念与控制(二)
下一篇: Qt 概述
万我.
博客等级 码龄1年 460粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值