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

计算机操作系统基础(14)---线程同步的条件变量

时间:2023-03-30 00:04:12 PHP

简介本文为第十四篇,线程同步的条件变量。在读写较少的情况下,性能优于mutex。本文介绍另一种处理线程同步的重要方法---条件变量conditionvariable条件变量是一种比较复杂的线程同步方法conditionvariable允许线程休眠直到满足某个条件。线程发送信号通知唤醒线程。对于前面介绍的生产者消费者模型,其实存在一定的漏洞。当buffer小于0时,不允许消费者消费。当缓冲区已满时,消费者必须等待。生产者可以在缓冲区内生产。生产者必须等待。这在上一篇文章中没有限制。本文在学习条件变量时,会对this进行更严格的约束。假设此时缓冲区等于0,当生产者生产产品时,唤醒可能正在等待的消费者。假设缓冲区已满,当消费者消费一个产品时,唤醒可能等待的生产者条件变量的例子(需要配合互斥锁使用)#include#include#include<标准库。h>#include#include#include#include//临界资源intnum=0;//缓冲区最大值intMAX_BUF=100;//定义条件变量pthread_cond_tcond=PTHREAD_COND_INITIALIZER;//定义互斥量pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;void*producer(void*){while(true){pthread_mutex_lock(&mutex);while(num>=MAX_BUF){//等待pthread_cond,wait(&&mutex);printf("缓冲区已满,等待消费者消费\n");}数+=1;printf("生产一个产品,当前产品数量为:%d",num);sleep(1);//生产产品所需的时间//通知可能正在等待的消费者pthread_cond_signal(&cond);printf("通知消费者...\n");//解锁pthread_mutex_unlock(&mutex);睡觉(1);生产产品的频率}}void*consumer(void*){while(true){pthread_mutex_lock(&mutex);while(num<=0){//等待pthread_cond_wait(&cond,&mutex);printf("缓冲区为空,等待生产者生产\n");}num-=1;printf("消费一个商品,当前商品数量为:%d",num);睡觉(1);//通知可能正在等待的生产者pthread_cond_signal(&cond);printf("通知生产者...\n");//解锁pthread_mutex_unlock(&mutex);}}intmain(){//定义两个线程pthread_tthread1,thread2;//一个执行生产者逻辑,一个执行消费者逻辑pthread_create(&thread1,NULL,&producer,NULL);pthread_create(&thread2,NULL,&consumer,NULL);pthread_join(&thread1,NULL);pthread_join(&thread2,NULL);return0;}执行结果:在瞬息万变的技术中寻找相同点,是一个技术人的核心竞争力。知行合一,理论联系实际