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