生产者 - 消费者模型的终止条件

时间:2015-07-05 17:41:22

标签: c pthreads mutex semaphore producer-consumer

我正在学习Pthread编程。这是我在任务结束时得到的问题:

我想使用.txt问题将源文件中的每个字节复制到新的producer-consumer文件。
这是我的代码结构:

void *producer(....) {
     while(1){
        nsleep();
        read_byte(....);
        nsleep();
        produceToBuffer(....);
     }
}
void *consumer(....) {
     while(1){
        nsleep();
        consumeFromBuffer(....);
        nsleep();
        write_byte(....);
     }
}


int main() {
        pthread_t inThread[nIn];
        pthread_t outThread[nOut];

        //initialize mutex locks for all functions
        pthread_mutex_init(&_mutexConsume, NULL);
        pthread_mutex_init(&_mutexProduce, NULL);
        pthread_mutex_init(&_mutexWrite, NULL);
        pthread_mutex_init(&_mutexRead, NULL);


        sem_init(&empty, 0, size);  //initialize semaphore signal the empty slots available
        sem_init(&full, 0, 0);      //initialize semaphore full signal

        for(i = 0; i < nIn; i++) {
            pthread_create(inThread+i, NULL, producer, null);

        }

        for(j = 0; j < nOut; j++) {
            pthread_create(outThread+i, NULL, consumer, null);

        }
}


我的问题是:生成器线程在文件末尾完成,当检测到EOF时为pthread_exit(0);,但对于消费者线程,我认为要么在睡眠之后完成,要么在所有消费者线程等待信号量满后。
有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

有没有理由在生产者离开后让消费者线程保持活跃状态​​?

如果没有,您可以通知消费者线程没有更多的生产者线程并将其用作终止信号,因此您的主线程等待所有生产者线程。

您可以使用pthread_join(producer_thread_id)等待生产者线程完成,并且在完成所有生成器线程后,对每个使用者线程使用pthread_cancel(consumer_thread_id)来中止其执行。

使用thread_id时,您需要将每个pthread_create保存到数组中,以便将其用于pthread_cancelpthread_join

您可以阅读pthread_join herepthread_cancel here