C语言 线程同步互斥生产者消费者
来源:互联网 发布:专业 有限元分析软件 编辑:程序博客网 时间:2024/06/06 12:55
gcc producer_and_consumer.c -pthread
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <errno.h>#include <error.h>#include <semaphore.h>#define PRODUCER_NUM 10#define CONSUMER_MUM 8#define BUFFER_SIZE20#define SLEEP_TIME 1#define error_exit( _msg_ )error(EXIT_FAILURE, errno, _msg_)int print();void *consumer_thread(void *args);void *producer_thread(void *args);sem_t can_produce;sem_t can_consume;pthread_mutex_t mutex;int produce_index = 0;int consume_index = 0;int producer_id = 0;int consumer_id = 0;int buffer[BUFFER_SIZE] = {0};int main(){int i;pthread_t producer[PRODUCER_NUM];pthread_t consumer[CONSUMER_MUM];int sinit1 = sem_init(&can_produce, 0, BUFFER_SIZE);int sinit2 = sem_init(&can_consume, 0, 0);if(sinit1 || sinit2)error_exit("sem_init");if(pthread_mutex_init(&mutex, NULL))error_exit("pthread_mutex_init");for(i=0; i<PRODUCER_NUM; i++)if(pthread_create(&producer[i], NULL, producer_thread, NULL))error_exit("pthread_create");for(i=0; i<CONSUMER_MUM; i++)if(pthread_create(&consumer[i], NULL, consumer_thread, NULL))error_exit("pthread_create");for(i=0; i<PRODUCER_NUM; i++)pthread_join(producer[i], NULL);for(i=0; i<CONSUMER_MUM; i++)pthread_join(consumer[i], NULL);}void *producer_thread(void *args){int id = producer_id++;while(1){sleep(SLEEP_TIME);pthread_mutex_lock(&mutex);sem_wait(&can_produce);printf("Producer id %d in %d.\n", id, produce_index);buffer[produce_index] = 1;produce_index = (produce_index + 1) % BUFFER_SIZE;print();sem_post(&can_consume);pthread_mutex_unlock(&mutex);}return NULL;}void *consumer_thread(void *args){int id = consumer_id++;while(1){sleep(SLEEP_TIME);pthread_mutex_lock(&mutex);sem_wait(&can_consume);printf("Consumer id %d in %d.\n", id, consume_index);buffer[consume_index] = 0;consume_index = (consume_index + 1) % BUFFER_SIZE;print();sem_post(&can_produce);pthread_mutex_unlock(&mutex);}return NULL;}int print(){int i;printf("Buffer:\n");for(i = 0; i < BUFFER_SIZE; i++)printf("___");printf("\n");for(i = 0; i < BUFFER_SIZE; i++)printf("|%d|", buffer[i]);printf("\n");for(i = 0; i < BUFFER_SIZE; i++)printf("___");printf("\n");return 0;}
0 0
- C语言 线程同步互斥生产者消费者
- 线程的同步与互斥---生产者消费者模型
- 互斥与同步---生产者与消费者
- java同步互斥,生产者消费者
- 生产者、消费者 线程同步
- 线程同步--生产者消费者
- 生产者与消费者模式(线程的同步与互斥)
- 经典生产者与消费者问题(线程的同步与互斥)
- 【线程的同步与互斥 (互斥量 条件变量 信号量)】生产者与消费者模型
- 线程的同步与互斥(生产者与消费者模型)
- 利用线程的同步和互斥解决两个消费者两个生产者一个临界区问题
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- linux中的生产者和消费者问题--信号量 互斥 同步
- 资源同步与互斥问题(生产者与消费者)
- python 生产者,消费者的同步互斥问题
- 三个同步与互斥问题之生产者与消费者
- 多线程--同步互斥&生产者消费者(一)
- 多线程--同步互斥&生产者消费者(一)
- VS2010打开VS2012的项目
- iOS Developer Library Frameworks
- java调用命令行Runtime.getRuntime().exec()阻塞问题
- poj 2479 Maximum sum (子序列和最大问题)
- 总结
- C语言 线程同步互斥生产者消费者
- 我是一只笨鸟——我想理清自己的编程能力
- Spring的applicationContext.xml常用配置
- 数组求和算法(线性递归版、二分递归版)、数组倒置(多递归基递归版)
- 《SBT in Action》- Setting up SBT and an SBT Build
- 高校俱乐部 之 人人code,整数取反
- DBCP数据库连接池的使用
- swing 中paint与paintComponent的区别(jcomponent)
- Spring常用的web.xml文件配置