我正在学习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);
,但对于消费者线程,我认为要么在睡眠之后完成,要么在所有消费者线程等待信号量满后。
有人可以帮我吗?
答案 0 :(得分:1)
有没有理由在生产者离开后让消费者线程保持活跃状态?
如果没有,您可以通知消费者线程没有更多的生产者线程并将其用作终止信号,因此您的主线程等待所有生产者线程。
您可以使用pthread_join(producer_thread_id)
等待生产者线程完成,并且在完成所有生成器线程后,对每个使用者线程使用pthread_cancel(consumer_thread_id)
来中止其执行。
使用thread_id
时,您需要将每个pthread_create
保存到数组中,以便将其用于pthread_cancel
和pthread_join