1

我正在通过生产者读取文件并将它们写入消费者的其他文件,当生产者读取输入文件时,我需要关闭其中一个信号量,消费者不再等待生产者将一些新输入插入缓冲区。有没有办法做到这一点?

问候...

4

1 回答 1

3

几种可能性:

  • 使用指示生产者完成的标志。从信号量中解除阻塞的消费者需要检查该标志并在设置时进行清理。当生产者设置标志时,它可以向信号量发出足够多的时间来释放任何可能的消费者。您需要注意处理排队等待消费的竞争条件,但在消费者通过检查标志之前设置了“生产者完成”标志。如果您让消费者线程继续并尝试使工作项出队,那么这可能很容易处理,但是让他们干净地处理即使信号量已发出信号也无事可做的情况。然后让他们查看“生产者完成”标志。
  • 用于pthread_kill()向任何等待的消费者发送信号。这应该将他们踢出 ,在sem_wait()那里他们可以检查EINTR返回码。这也需要仔细编码以避免竞争。我对 POSIX 信号处理不是特别熟悉,但我确信它有自己的一套包袱,你需要非常小心地正确处理。
  • 切换到使用带有互斥锁的条件变量,您可以在持有互斥锁的同时自动检查队列状态和完成条件。

当然,一旦完成,某人(生产者线程?)需要等待所有消费者线程清理 - 可能通过pthread_join()对它们执行操作 - 在信号量被销毁/关闭之前。

如果您已经使用信号量对某些内容进行了编码,则条件变量选项可能会发生更大的变化,并且在正常情况下在生产和消费(可能)时它可能不会那么高效。但我敢打赌,推理可能的竞争条件并正确处理它们会更容易。请注意,我并不是说这很容易,只是说它可能更容易。

于 2011-04-11T18:22:40.470 回答