C 具有互斥和pthread的生产者和消费者

C 具有互斥和pthread的生产者和消费者,c,multithreading,C,Multithreading,因此,我在生产者和消费者的问题上遇到了一些问题,有两个线程和互斥锁。我要做的是让制作人用10个1填充一个数组。然后消费者消费每个1并将其设为0。这种填充和清空只重复10次。以下是我到目前为止的情况,但它在第一个循环中被卡住了: #include <stdio.h> #include <pthread.h> #define N 10 pthread_mutex_t mut; pthread_cond_t condc,condp; int queue[N]; int buf

因此,我在生产者和消费者的问题上遇到了一些问题,有两个线程和互斥锁。我要做的是让制作人用10个1填充一个数组。然后消费者消费每个1并将其设为0。这种填充和清空只重复10次。以下是我到目前为止的情况,但它在第一个循环中被卡住了:

#include <stdio.h>
#include <pthread.h>
#define N 10

pthread_mutex_t mut;
pthread_cond_t condc,condp;
int queue[N];
int buffer;

void* prod() {
    int i;
    for(i = 0; i<10; i++) {
        pthread_mutex_lock(&mut);
        while(queue[N] != 0) {
            pthread_cond_wait(&condp, &mut);
        }
        int k = 0;
        for(k=0; k<10; k++) {
            queue[k] = 1;
        }

        pthread_cond_signal(&condc);
        pthread_mutex_unlock(&mut);
        printf("\nproduced\n");
    }
    pthread_exit(0);
}

void* cons() {
    int i;
    for(i = 0; i<10; i++) {
        pthread_mutex_lock(&mut);
        while(queue[N] == 0) {
            pthread_cond_wait(&condc, &mut);
        }
        int k = 0;
        for(k=0; k<10; k++) {
            queue[k] = 0;
        }
        pthread_cond_signal(&condp);
        pthread_mutex_unlock(&mut);
        printf("\nconsumed\n");
    }
    pthread_exit(0);
}

main() {
    pthread_t producer, consumer;
    pthread_mutex_init(&mut, 0);
    pthread_cond_init(&condc, 0);
    pthread_cond_init(&condp, 0);
    pthread_create(&consumer,NULL,&cons, NULL);
    pthread_create(&producer,NULL,&prod, NULL);
    pthread_join(producer,0);
    pthread_join(consumer,0);
    pthread_cond_destroy(&condc);
    pthread_cond_destroy(&condp);
    pthread_mutex_destroy(&mut);

    return 0;
}
#包括
#包括
#定义n10
pthread_mutex_t mut;
pthread_cond_t condc,condp;
int队列[N];
int缓冲区;
void*prod(){
int i;

对于(i=0;i在开始读取
队列
的成员之前,您不会将其初始化为任何特定值。此外,您读取的
队列
超出了范围--它有十个值,但您读取的是第十一个值。最后,您永远不会更改您读取的值--您设置了前十个值,您永远不会查看它们。

您的意思是什么<代码>队列[N]
?它只是填满了阵列。我的意思是,为什么要访问阵列外部的内存?这是导致问题的原因吗?队列[N]是非法访问超出绑定的内存区域。请先更改该值,然后重新发布。