【问题标题】:end condition for producer-consumer model生产者-消费者模型的结束条件
【发布时间】:2015-09-22 20:26:51
【问题描述】:

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

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

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);,但对于消费者线程,我的想法是在睡眠后完成或在所有消费者线程等待信号量满时完成。
有人可以帮我吗?

【问题讨论】:

  • 我不确定我是否理解您的问题。您显示的不可编译的半伪代码使情况变得更糟。你不知道如何告诉消费者输入结束了?一种可能的方法是通过在缓冲区队列中插入一个特殊值来表示这一点。

标签: c pthreads mutex semaphore producer-consumer


【解决方案1】:

生产者离开后是否有理由让消费者线程保持活动状态?

如果没有,您可以向消费者线程发出信号,不再有生产者线程,并将其用作终止信号,以便您的主线程等待所有生产者线程。

您可以使用pthread_join(producer_thread_id) 等待生产者线程完成,一旦所有生产者线程都完成后,对每个消费者线程使用pthread_cancel(consumer_thread_id) 以中止它们的执行。

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

你可以阅读pthread_joinherepthread_cancelhere

【讨论】:

  • 我的第二个想法是,我的想法是在生产函数 sem_post(&semaphore) 和消费者函数 sem_wait(&semaphore) 中使用生产者线程数的值初始化一个信号量;主要是,我们检查信号量是否为 0,这意味着没有更多的生产者正在生产要缓冲的项目。
  • 不确定我是否完全理解 - 如果您在生产者中 sem_post 和在消费者中 sem_wait,并且您的消费者少于生产者,这将不起作用。即使您拥有相同数量的消费者和生产者,它也不会起作用,因为信号量将始终为 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多