当前位置: 首页 > 后端技术 > PHP

计算机操作系统基础(11)---线程同步互斥锁

时间:2023-03-29 19:24:42 PHP

介绍方法,本文介绍的是线程同步方法之一---互斥锁。推荐复习这篇《计算机操作系统基础(四)---进程管理之进程同步》,方便后面几篇关于线程同步和进程同步的文章的理解。互斥量在进程同步到生产者和消费者模型一文中有介绍。在这个模型中,有两个线程分别充当生产者和消费者。在并发的情况下,这两个线程很可能同时操作临界资源。如果他们同时操作临界资源,可能会导致线程同步问题。互斥量是线程同步的解决方案之一。互斥体如何解决这个问题?mutex是为了保证当一个线程,比如线程1,在操作一个临界资源的时候,能够阻止其他线程访问这个临界资源。这就是互斥量的工作原理。在之前的生产者和消费者模型中,导致线程同步的最根本原因其实是:两个线程的指令交错执行,互斥量可以保证两个线程的指令不会交错执行。其实互斥锁的作用也叫原子性,互斥锁其实就是保证了这些关键指令的原子性。原子性是:原子性是指一系列操作的不间断特性。这一系列操作要么全部执行,要么不执行。没有部分执行。partialunexecuted的情况就像刚才producer的操作,producer的操作分为三个指令。根据原子性的特点,这3条指令要么全部执行,要么不执行。没有执行到其中一两个就抢CPU的说法。互斥量是最简单的线程。同步方式mutex(互斥锁),处于两种状态之一的变量:unlocked和locked,保证资源访问的序列化(如果资源被锁定,即资源被某个线程锁定,如果被另一个线程使用线程要使用这个资源,只能等待正在使用这个资源的线程释放资源,其他线程才能使用这个资源,从而保证资源访问的序列化)互斥锁代码示例没有使用互斥量#include#include#include#include$include//关键资源intnum=0;//producervoid*producer(void*){inttimes=100000000;//循环一百万次while(times--){num+=1;//每次生产一个产品}}//consumervoid*comsumer(void*){int次=100000000;while(times--){num-=1;//一次消费一个产品}}intmain(){printf("从主函数开始。");//定义两个线程pthread_tthread1,thread2;//一个执行生产者逻辑,一个执行消费者逻辑pthread_create(&thread1,NULL,&producer,NULL);pthread_create(&thread2,NULL,&comsumer,NULL);pthread_join(&thread1,NULL);pthread_join(&thread2,NULL);//打印关键资源的值printf("Printinmainfunction:num=%d\n",num);}运行结果:虽然生产者和消费者循环次数相同,但是num的结果是不为0,所以存在生产者和消费者问题使用mutex解决这个问题#include#include#include#include$include//初始化mutex数量pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;//criticalresourceintnum=0;//producervoid*producer(void*){inttimes=100000000;//循环一百万次while(times--){//lockpthread_mutex_lock(&mutex);num+=1;//每次生产一个产品//解锁pthread_mutex_unlock(&mutex);}}//消费者void*comsumer(void*){inttimes=100000000;while(times--){//锁定pthread_mutex_lock(&mutex);num-=1;//一次消费一个产品//unlockpthread_mutex_unlock(&mutex);}}intmain(){printf("从主函数开始。");//定义两个线程pthread_tthread1,thread2;//一个执行生产者逻辑,一个执行消费者逻辑pthread_create(&thread1,NULL,&producer,NULL);pthread_create(&thread2,NULL,&comsumer,NULL);pthread_join(&thread1,NULL);pthread_join(&thread2,NULL);//打印关键资源的值printf("Printinmainfunction:num=%d\n",num);}运行结果:结果为0,说明加互斥量有效。加锁之后,其实你会发现代码的执行时间会变长。这是因为加锁会带来性能损失。这是互斥量的内容。例子是用C语言写的,各种语言都有提供互斥锁的API。PHP的mutexAPI可以在这里找到:https://www.php.net/mutex变化是一个技术人的核心竞争力。知行合一,理论与实践相结合