生产者---消费者模型之信号量
来源:互联网 发布:怎么制作一个软件 编辑:程序博客网 时间:2024/06/01 10:50
信号量:
(1)定义信号量:
sem_t semaphore; //定义一个名为semaphore的信号量;
(2)初始化信号量int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
sem_t* sem:要初始化的信号量;
int pshared:pshared = 0;
usigned int value:该信号信号量的初值;
返回值:
a.返回0,表示初始化成功;
b.返回-1,表示操作失败;
(3)P操作
int sem_wait(sem_t* sem); //对于信号量sem进行P操作;int sem_trywait(sem_t* sem);
(4)V操作
int sem_post(sem_t* sem); //对于信号量sem进行V操作
生产者-消费者模型:
交易场所:环形队列;
注:使用信号量进行互斥和同步;
单进程单生产者--单消费者代码实现:
producter_consumer.c#include<stdio.h>#include<pthread.h>#include<semaphore.h>sem_t blank_count;sem_t data_count;int cycle_queue[20];void* producter_running(void* arg){ int step = 0; while(1) { sem_wait(&blank_count); //P int data = rand()%1000; cycle_queue[step] = data; step++; step %= 20; printf("the producter is %d\n",data); sem_post(&data_count); //V }}void* consumer_running(void* arg){ int step =0; while(1) { sleep(1); sem_wait(&data_count); int data = cycle_queue[step]; step++; step %= 20; printf("the consumer is %d\n",data); sem_post(&blank_count); }}//producter_consumer based on single threadint main(){ pthread_t producter1; pthread_t consumer1; sem_init(&blank_count,0,20); sem_init(&data_count,0,0); pthread_create(&producter1,NULL,producter_running,NULL); pthread_create(&consumer1,NULL,consumer_running,NULL); pthread_join(producter1,NULL); pthread_join(consumer1,NULL); return 0;}
Makefile:producter_consumer:producter_consumer.c gcc -o $@ $^ -lpthread.PHONY:cleanclean: rm -f producter_consumer
运行结果: 单进程多生产者多消费者的生产者消费者模型:
producter_consumer.c
#include<stdio.h>#include<pthread.h>#include<semaphore.h>sem_t blank_count;sem_t data_count;int cycle_queue[20];pthread_mutex_t pro = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t con = PTHREAD_MUTEX_INITIALIZER;void* producter_running(void* arg){ static int step = 0; while(1) { pthread_mutex_lock(&pro); sem_wait(&blank_count); //P int data = rand()%1000; cycle_queue[step] = data; step++; step %= 20; printf("producter:pthread_id:%u--->data:%d\n",pthread_self(),data); sem_post(&data_count); //V pthread_mutex_unlock(&pro); } return NULL;}void* consumer_running(void* arg){ static int step =0; while(1) { pthread_mutex_lock(&con); sem_wait(&data_count); int data = cycle_queue[step]; step++; step %= 20; printf("consumeer;pthread_id:%u--->data:%d\n",pthread_self(),data); sem_post(&blank_count); pthread_mutex_unlock(&con); sleep(1); }}//producter_consumer based on single threadint main(){ pthread_t producter1; pthread_t producter2; pthread_t consumer1; pthread_t consumer2; sem_init(&blank_count,0,20); sem_init(&data_count,0,0); pthread_create(&producter1,NULL,producter_running,NULL); pthread_create(&producter2,NULL,producter_running,NULL); pthread_create(&consumer1,NULL,consumer_running,NULL); pthread_create(&consumer2,NULL,consumer_running,NULL); pthread_join(producter1,NULL); pthread_join(producter2,NULL); pthread_join(consumer1,NULL); pthread_join(consumer2,NULL); sem_destroy(&blank_count); sem_destroy(&data_count); pthread_mutex_destroy(&pro); pthread_mutex_destroy(&con); return 0;}
运行结果:
作者水平有限,若有问题,请留言,谢谢!!!
阅读全文
2 2
- 生产者---消费者模型之信号量
- Win32信号量实现生产者消费者模型
- Win32信号量实现生产者消费者模型
- 信号量(生产者和消费者模型)
- 两个信号量实现生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- POSIX信号量之生产者消费者问题
- Linux 生产者、消费者之环形队列信号量
- 生产者-消费者信号量问题
- 信号量综合实例:实现生产者-消费者模型
- 进程间通信-信号量集 (生产者-消费者模型)
- IPC--信号量 Semaphore 生产者 消费者模型 (semget semop semctl)
- 生产者消费者模型(为什么使用两个信号量?)
- 信号量实现环形buff下多生产者多消费者模型
- jquery的zTree
- 饿
- 模板:快速幂
- wireshark源码探索No.2---文档
- hibernate配置二级缓存三种方式
- 生产者---消费者模型之信号量
- 【Matlab】图像插值函数interp2理解
- 从零开始学_JavaScript_系列(37)——让浏览器支持es7特性
- pyspark写法总结
- Android多页面开发
- Ubuntu14.04下安装wechat(微信)
- 初识Gradle
- Subsets (backtracking)
- 连接池原理