生产者、消费者问题(C语言、POSIX)

发布于:2025-07-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

利用C语言编写,使用POSIX线程,利用条件变量和互斥锁来完成资源调用和实现线程同步。代码如下:

//生产者和消费者问题
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
char g_storage[10];//仓库
int g_stock = 0;//库存量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥锁
pthread_cond_t pcond = PTHREAD_COND_INITIALIZER;//全局条件变量并初始化(生产者卧室) 
pthread_cond_t ccond = PTHREAD_COND_INITIALIZER;//全局条件变量并初始化(消费者卧室) 
//显示生产消费过程 生产者:ABC<--X   消费者:ABC-->X
void show(char* who,char* op,char prod){
    printf("%s:",who);
    for(int i = 0;i < g_stock;i++){
        printf("%c",g_storage[i]);
    }
    printf("%s%c\n",op,prod);
}
//生产者线程
void* producer(void* arg){
    char* who = (char*)arg;//生产者
    for(;;){
        //加锁
        pthread_mutex_lock(&mutex);
        //判满
        if(g_stock == 10){
            printf("%s:已满仓\n",who);
            pthread_cond_wait(&pcond,&mutex);
        }
        //生产
        char prod = 'A' + rand() % 26;
        show(who,"<--",prod);
        g_storage[g_stock] = prod;
        g_stock++;
        //唤醒
        pthread_cond_signal(&ccond);
        //解锁
        pthread_mutex_unlock(&mutex);

        usleep((rand() % 100) * 1000);
    }
    return NULL;
}
//消费者线程
void* consumer(void* arg){
    char* who = (char*)arg;//消费者
    for(;;){
        //加锁
        pthread_mutex_lock(&mutex);
        //判空
        if(g_stock == 0){
            printf("%s:空仓\n",who);
            pthread_cond_wait(&ccond,&mutex);
        }
        //消费
        char prod = g_storage[--g_stock];
        show(who,"-->",prod);
        //唤醒
        pthread_cond_signal(&pcond);
        //解锁
        pthread_mutex_unlock(&mutex);

        usleep((rand() % 100) * 1000);
    }
    return NULL;
}
int main(void){
    srand(getpid());
    pthread_t t1,t2;
    pthread_create(&t1,NULL,producer,"生产者");
    pthread_create(&t2,NULL,consumer,"消费者");
    getchar();//不按回车键就不结束 
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到