Linux 线程安全

文章介绍了Linux环境中多线程编程中的线程安全问题,重点讨论了临界资源、原子性和互斥量的概念。通过示例展示了如何使用互斥量解决并发访问临界资源导致的数据不一致性,并解释了死锁的四个必要条件。此外,还提到了条件变量在线程同步中的应用。
摘要由CSDN通过智能技术生成

传统艺能😎

小编是双非本科大二菜鸟不赘述,欢迎米娜桑来指点江山哦
在这里插入图片描述
1319365055

🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,满怀希望,所向披靡,打码一路向北
一个人的单打独斗不如一群人的砥砺前行
这是和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我


在这里插入图片描述

Linux线程安全😊

临界资源: 多线程执行流共享的资源叫做临界资源。
临界区: 每个线程内部,访问临界资源的代码,就叫做临界区。
互斥: 任何时刻有且只有一个执行流进入临界区,访问临界资源,互斥对临界资源起保护作用。
原子性: 不会被任何调度机制打断的操作,该操作只有两态:完成和未完成

说明一下,我们如果需要进行进程间通信,我们就需要先创建一个第三方资源,让不同的进程看到同一份资源,但是由于第三方资源可以由不同的模块来提供,所以就有了不同的通信方式,这个第三方资源部就是临界资源,访问第三方资源的地方就是临界区。

为什么说线程是神就是因为线程不需要创建第三方资源就可以进行通信,大部分资源时共享的,比如线程进行计数时我们在全局区定义count 变量,每隔一秒打印一次:

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

int count = 0;
void* Routine(void* arg)
{
   
	while (1){
   
		count++;
		sleep(1);
	}
	pthread_exit((void*)0);
}
int main()
{
   
	pthread_t tid;
	pthread_create(&tid, NULL, Routine, NULL);
	while (1){
   
		printf("count: %d\n", count);
		sleep(1);
	}
	pthread_join(tid, NULL);
	return 0;
}

结果如下:

在这里插入图片描述
这里的 count 就叫做临界资源,因为它被多个执行流共享,而主线程中的printf和新线程中count++就叫做临界区,因为这些代码对临界资源进行了访问

原子性&互斥🤣

原子性指的是不可被分割的操作,该操作不会被任何调度机制打断,该操作只有两态,要么完成,要么未完成。在多线程情况下,如果这多个执行流都自顾自的对临界资源进行操作,那么此时就可能导致数据不一致的问题。解决该问题的方案就叫做互斥,互斥的作用就是,保证在任何时候有且只有一个执行流进入临界区对临界资源进行访问。

我们可以模拟实现一个抢票系统,票的剩余张数定义为全局变量,主线程创建四个新线程,让这四个新线程进行抢票,当票被抢完后这四个线程自动退出:

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

int tickets = 1000;
void* TicketGrabbing(void* arg)
{
   
	const char* name = (char*)arg;
	while (1){
   
		if (tickets > 0){
   
			usleep(10000);
			printf("[%s] get a ticket, left: %d\n", name, --tickets);
		}
		else{
   
			break;
		}
	}
	printf("%s quit!\n", name);
	pthread_exit((void*)0);
}
int main()
{
   
	pthread_t t1, t2, t3, t4;
	pthread_create(&t1, NULL, TicketGrabbing, "thread 1");
	pthread_create(&t2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔乔家的龙龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值