c用信号量(Semaphore)实现消费者生产者同步
来源:互联网 发布:windows 10版本 编辑:程序博客网 时间:2024/05/19 20:00
// 前面一篇博客的生产者-消费者的例子是基于链表的,其空间可以动态分配,现在基于固定大小的环形队列重写这个程序:#include <stdlib.h>#include <pthread.h>#include <stdio.h>#include <semaphore.h>#define NUM 5int queue[NUM];/** * semaphore变量的类型为sem_t,sem_init()初始化一个semaphore变量, * value参数表示可用资源的数量,pshared参数为0表示信号量用于同一进程的线程间同步 */sem_t blank_number, product_number;void *producer(void *arg){ static int p = 0; while(1){ // 调用sem_wait()可以获得资源,使semaphore的值减1,如果调用sem_wait()时semaphore的值已经是0,则挂起等待。 // 如果不希望挂起等待,可以调用sem_trywait()。 // 这里使得blank_number的值减1,初始值是5 sem_wait(&blank_number); queue[p] = rand()%1000; printf("Produce %d\n", queue[p]); p = (p+1)%NUM; sleep(rand()%5); // 调用sem_post()可以释放资源,使semaphore的值加1,同时唤醒挂起等待的线程。 // 使得product_number值加1,初始值是0 sem_post(&product_number); }}void *consumer(void *arg){ static int c = 0; while(1){ // 使得product_number值加1,初始值是0 sem_wait(&product_number); printf("Consume %d\n", queue[c]); c = (c+1)%NUM; sleep(rand()%5); // 这里使得blank_number的值减1,初始值是5 sem_post(&blank_number); }}int main(int argc, char *argv[]){ //刷新 console cdt下的配置,其他可以忽略 setbuf(stdout,NULL); pthread_t pid, cid; sem_init(&blank_number, 0, NUM); sem_init(&product_number, 0, 0); pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); sem_destroy(&blank_number); sem_destroy(&product_number); return 0;}
这篇和上一篇博客的例子给出一个重要的提示:用
Condition Variable
可以实现Semaphore
。有时间用Condition Variable
实现Semaphore
,然后用自己实现的Semaphore重写本节的程序。
阅读全文
0 0
- c用信号量(Semaphore)实现消费者生产者同步
- 进程同步问题-生产者消费者问题(linux semaphore实现)
- Posex信号量 实现进程间的同步(生产者&消费者)
- java中的信号量semaphore实现生产者消费者模式
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- Java Semaphore 生产者消费者线程同步
- 信号量实现生产者消费者问题
- Java多线程--生产者消费者模型(Semaphore实现)
- IPC--信号量 Semaphore 生产者 消费者模型 (semget semop semctl)
- -信号量(Semaphore)在生产者和消费者模式的使用
- Java实现同步机制(生产者消费者)
- 使用semaphore实现生产者-消费者简单模型
- 使用semaphore实现生产者-消费者简单模型
- 生产者消费者问题(信号量)
- linux c 生产者与消费者问题 信号量(sem_t)
- 生产者消费者---C实现
- linux 线程间使用信号量实现消费者生产者
- 生产者消费者问题Semaphore
- Coursra-MachineLearning 第二次作业总结
- OpenCV-利用cvPtr2D存取矩阵元素和用cvGetReal2D取矩阵元素
- format函数
- [LeetCode]295. Find Median from Data Stream
- <input>标签用val()取不到值
- c用信号量(Semaphore)实现消费者生产者同步
- tar包方式安装Mysql
- servlet之el表达式
- 网上商城项目总结 续
- adb push adb pull adb shell实验记录
- python-基础笔记6-文件处理常用函数
- 关闭oracle数据库多个实例
- APP支付宝支付
- D3.js和highcharts,echarts性能对比