生产者--消费者模型之互斥锁和条件变量
来源:互联网 发布:淘宝生意参谋竞争情报 编辑:程序博客网 时间:2024/04/20 07:20
生产者-消费者模型
三种关系:
(1)生产者与生产者:互斥关系;
(2)生产者与消费者:互斥与同步的关系;
(3)消费者与消费者:互斥关系;
两种角色:(1)生产者;(2)消费者;
一种交易场所:单链表;
注:交易场所通常指的是生产者生产的数据以及消费者消费的数据所保存的数据结构;
互斥锁:
定义互斥锁:
全局定义以及初始化;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;局部定义以及初始化:
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
解锁;
int pthread_mutex_unlock(pthread_mutex_t *mutex);
销毁互斥锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
注:为了解决临界资源的互斥访问,所以使用互斥锁进行临界资源的互斥访问;但是,互斥访问会导致某些进程或者线程的饥饿问题,所以要进行线程或者进程间的同步,使用条件变量可以实现线程间的同步。
条件变量
定义:条件变量是来描述某些资源是否到达的状态;
定义条件变量:
全局定义以及初始化:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
局部定义以及初始化:
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
等待条件变量就绪和互斥锁被解锁;
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
唤醒 在等待的线程:
(1)唤醒一个线程;
int pthread_cond_signal(pthread_cond_t *cond);
(2)唤醒多个进程:
int pthread_cond_broadcast(pthread_cond_t *cond);
销毁条件变量:
int pthread_cond_destroy(pthread_cond_t *cond);
注:条件变量通过与互斥锁的结合,解决了线程间的互斥与同步;
生产者---消费者模型
注:交易场所为C++STL的list;
producter_consumer.cpp:
#include<stdlib.h>#include<list>#include<pthread.h>#include<iostream>using namespace std;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;list<int> list1;void* producter_running(void* arg){ while(1) { pthread_mutex_lock(&lock); int data = rand()%1000; list1.push_front(data); cout<<"the producter is done........"<<data<<endl; pthread_mutex_unlock(&lock); pthread_cond_signal(&cond); sleep(1); }}void* consumer_running(void* arg){ int data = 0; while(1) { data = -1; pthread_mutex_lock(&lock); if(list1.empty()) { pthread_cond_wait(&cond,&lock); } data = list1.front(); list1.pop_front(); cout<<"the consumer is done........"<<data<<endl; pthread_mutex_unlock(&lock); }}int main(){ pthread_t producter; pthread_t consumer; pthread_create(&producter,NULL,producter_running,NULL); pthread_create(&consumer,NULL,consumer_running,NULL); cout<<"the producer id"<<producter<<endl; cout<<"the consumer id"<<consumer<<endl; pthread_join(producter,NULL); pthread_join(consumer,NULL); pthread_mutex_destroy(&lock); pthread_cond_destroy(&cond); return 0;}
Makefile:producter_consumer_cpp:producter_consumer.cpp g++ -o $@ $^ -lpthread.PHONY:cleanclean: rm -f producter_consumer_cpp
运行结果:下一篇:生产者-消费者模型用环形队列充当交易场所,使用信号量实现。
作者水平有限,若有问题,请留言,谢谢!!
阅读全文
1 0
- 生产者--消费者模型之互斥锁和条件变量
- 条件变量+互斥锁解决生产者消费者模型
- 互斥量和条件变量实现生产者消费者模型
- Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)
- 消费者生产者问题---线程互斥锁+条件变量
- 线程 ,生产者. 消费者 互斥锁,条件变量
- 互斥锁、条件变量:生产者消费者问题
- 线程同步:条件变量实现生产者消费者模型
- c++11多线程 生产者-消费者模型/条件变量condition_variable
- Linux生产者消费者模型--基于线程条件变量
- 【Linux】线程总结:线程同步 -互斥锁,条件变量,信号量实现多生产者多消费者模型
- 用条件变量和信号量解决生产者和消费者问题
- java多线程之生产者和消费者模型
- 多线程编程之生产者和消费者模型
- 生产者和消费者模型
- 生产者和消费者模型
- pthread-生产者消费者问题【采用互斥量和条件变量】
- Linux多线程,生产者消费者算法和条件变量的使用
- Java基本数据类型、引用类对比及实际项目高级应用 使用==与equal的机制与不同
- 极具个性化的【自定义日历】英式(纯干货)—超详细,记录你的学习计划与完成情况
- Cognos安装配置--单机环境
- hibernate5 生成session的方法
- 淘淘商城系列——内容分类管理
- 生产者--消费者模型之互斥锁和条件变量
- 欢迎使用CSDN-markdown编辑器
- js开发:javascript操作数组
- hihoCoder #1015 KMP算法
- DLL 函数导出的规则和方法
- hdoj1049 Climbing Worm(小学数学题)
- 今天真是醉了,来看一下除了穷举之外的求最大公约数算法.
- Problem D: 平面上的点和线——Point类、Line类 (V)
- 优化Mysql数据库的8个方法