线程同步——生产者消费者问题

/*buffer.h*/
typedef int buffer_item;
#define BUFFER_SIZE 5
#include "buffer.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#define TRUE 1
/* the buffer */
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t empty,full;
int insert_item(buffer_item item){
    /* insert item into buffer
       return 0 if successful, otherwise
       return -1 indicating an error condition
    */
    sem_wait(&empty);
    pthread_mutex_lock(&mutex);
    
    int i;
    for(i = 0;i < BUFFER_SIZE;i++){
        if(buffer[i] == 0){
            buffer[i] = item;
            break;
        }
    }
    if(i == BUFFER_SIZE) return -1; 
    pthread_mutex_unlock(&mutex);
    sem_post(&full);
    return 0;
}
int remove_item(buffer_item* item){
    /* remove an object from buffer
       placing it in item
       return 0 if successful, otherwise
       return -1 indicating an error condition
    */
    sem_wait(&full);
    pthread_mutex_lock(&mutex);
    
    int i;
    for(i = 0;i < BUFFER_SIZE;i++){
        if(buffer[i] != 0){
            *item = buffer[i];
            buffer[i] = 0;
            break;
        }
    }
    if(i == BUFFER_SIZE) return -1; 
    pthread_mutex_unlock(&mutex);
    sem_post(&empty);
    return 0;
}
void* producer(void* param){
    buffer_item rand_item;
    int randomtime;
    int* num = (int*)param;
    while(TRUE){
        /* sleep for a random period of time */
        randomtime = (rand() % 10) + 1;
        sleep(randomtime);
        /* generate a random number */
        rand_item = (rand() % RAND_MAX);
        printf("producer %d produced %d\n",*num,rand_item);
        if(insert_item(rand_item))
            printf("report error condition\n");
    }
    pthread_exit(0);
}
void* consumer(void* param){
    buffer_item rand_item;
    int randomtime;
    int* num = (int*)param;
    while(TRUE){
        /* sleep for a random period of time */
        randomtime = (rand() % 10) + 1;
        sleep(randomtime);
        if(remove_item(&rand_item))
            printf("report error condition\n");
        else
            printf("consumer %d consumed %d\n",*num,rand_item);
    }
    pthread_exit(0);
}

int main(int argc, char* argv[]){
    if(argc != 4) return -1;
    /*1. Get command line arguments argv[1], argv[2], argv[3]*/
    int time_to_sleep = atoi(argv[1]);
    int producer_num = atoi(argv[2]);
    int consumer_num = atoi(argv[3]);
    /*2. Initialize buffer*/
    
    /**********************************************************/  
    pthread_mutex_init(&mutex,NULL);
    sem_init(&empty,0,BUFFER_SIZE);
    sem_init(&full,0,0);
    /**********************************************************/
    
    memset(buffer,0,sizeof(buffer));
    srand((unsigned int)time(NULL));
    int i;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    
    /*3. Create producer thread(s)*/
    pthread_t producer_tid[producer_num];
    int p_num[producer_num];
    for(i = 0;i < producer_num;i++){
        p_num[i] = i + 1;
        pthread_create(&producer_tid[i],&attr,producer,&p_num[i]);
    }
    /*4. Create consumer thread(s)*/
    pthread_t consumer_tid[consumer_num];
    int c_num[consumer_num];
    for(i = 0;i < consumer_num;i++){
        c_num[i] = i + 1;
        pthread_create(&consumer_tid[i],&attr,consumer,&c_num[i]);
    }
    /*5. Sleep*/
    sleep(time_to_sleep);
    /*6. Exit*/
    return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值