php 线程互斥,计算机操作系统基础(十一)---线程同步之互斥量

本文详细介绍了互斥量作为线程同步的一种方法,通过生产者消费者模型阐述了互斥量如何防止指令交叉执行,确保线程安全。文中提供了未使用和使用互斥量的C语言代码示例,展示了加锁和解锁的过程,证明了互斥量在解决线程同步问题上的有效性。虽然互斥量会增加一定的性能开销,但其确保了资源访问的原子性和串行性。
摘要由CSDN通过智能技术生成

引言

本文为第十一篇,线程同步之互斥量,在前边的《计算机操作系统基础(四)---进程管理之进程同步》中提到了进程同步和线程同步的方法,本篇为线程同步方法之一---互斥量。建议重新回顾一下《计算机操作系统基础(四)---进程管理之进程同步》这篇文章,方便理解后边的几篇关于线程同步和进程同步的知识

互斥量

在进程同步的那篇文章中有介绍到生产者和消费者模型,该模型中有两个线程,分别充当生产者和消费者的角色,在并发的情况下,这两个线程很有可能同时去操作临界资源,如果同时去操作临界资源就有可能造成线程同步的问题,互斥量就是解决线程同步的方法之一

互斥量是如何解决这种问题的?

互斥量是保证当某一个线程,比如说线程1在操作临界资源时,它就可以阻止其它线程访问临界资源,这个就是互斥量的工作原理

1460000023091475

在前边的生产者和消费者模型中,引发线程同步的最根本原因其实就是:这两个线程的指令交叉执行,互斥量可以保证两个线程的指令不会交叉的执行

1460000023091473

其实互斥量的效果也称为原子性,互斥量其实就是保证了这些关键指令的原子性。原子性就是:

原子性是指一系列操作不可中断的特性

这一系列操作要么全部执行完成,要么全部没有执行

不存在部分执行,部分未执行的情况

就比如刚才的生产者的操作,生产者的操作分为三条指令,根据原子性的特性,这三条指令要么全部执行完成,要么全部未执行,不存在说执行了其中的一条或两条时CPU被抢走了

互斥量是最简单的线程同步方法

互斥量(互斥锁),处于两种状态之一的变量:解锁和加锁

两个状态可以保证资源访问的串行(如果说一个资源被加锁了,也就是这个资源被某一个线程所使用了,另外一个线程如果想使用这个资源的话,只能等待正在使用这个资源的线程释放资源,另外一个线程才可以使用这个资源,这样就保证了资源访问的串行)

互斥锁的代码示例

未使用互斥量

#include

#include

#include

#include

$include

//临界资源

int num=0;

//生产者

void *producer(void*){

int times = 100000000;//循环一百万次

while(times--){

num += 1;//每次生产一个产品

}

}

//消费者

void *comsumer(void*){

int times = 100000000;

while(times--){

num -= 1;//每次消费一个产品

}

}

int main()

{

printf("Start in main function.");

//定义两个线程

pthread_t thread1,thread2;

//一个执行生成者逻辑,一个执行消费者逻辑

pthread_create(&thread1, NULL, &producer, NULL);

pthread_create(&thread2, NULL, &comsumer, NULL);

pthread_join(&thread1, NULL);

pthread_join(&thread2, NULL);

//打印临界资源的值

printf("Print in main function: num = %d\n", num);

}

运行结果:

1460000023091476

虽然生产者和消费者循环的次数都是一样的,但是num的运行结果却不是0,这就存在生产者和消费者问题。通过互斥量来解决这个问题

使用互斥量

#include

#include

#include

#include

$include

//初始化互斥量

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

//临界资源

int num=0;

//生产者

void *producer(void*){

int times = 100000000;//循环一百万次

while(times--){

//加锁

pthread_mutex_lock(&mutex);

num += 1;//每次生产一个产品

//解锁

pthread_mutex_unlock(&mutex);

}

}

//消费者

void *comsumer(void*){

int times = 100000000;

while(times--){

//加锁

pthread_mutex_lock(&mutex);

num -= 1;//每次消费一个产品

//解锁

pthread_mutex_unlock(&mutex);

}

}

int main()

{

printf("Start in main function.");

//定义两个线程

pthread_t thread1,thread2;

//一个执行生成者逻辑,一个执行消费者逻辑

pthread_create(&thread1, NULL, &producer, NULL);

pthread_create(&thread2, NULL, &comsumer, NULL);

pthread_join(&thread1, NULL);

pthread_join(&thread2, NULL);

//打印临界资源的值

printf("Print in main function: num = %d\n", num);

}

运行结果:

1460000023091472

结果是0,说明加互斥量是有作用的。加锁之后其实会发现代码的执行时间会变长,这是因为加锁会带来性能的损耗

这就是互斥量的内容,示例是使用C语言进行编写,各种语言中也都有提供互斥量的API,PHP的互斥量API可参见这里:https://www.php.net/mutex

在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

1460000023091474

基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值