应用程序设计
我有一个 C++ 应用程序,它有一个生产者线程、多个队列(在运行时创建)和消费者线程。
生产者线程通过 Tcp/Ip 获取数据并放入相应的队列(例如,如果数据是 A 类型并放入队列 A)。
消费者线程当前从 1 - n 循环队列以处理来自每个队列的数据。
根据要求,无需跟踪上次更新或最少更新的队列。只要更新了任何队列,消费者就应该处理 1 - n 个队列。
如果任何队列的大小超过定义的限制,生产者线程将在插入新项目之前弹出第一个项目(以管理队列大小)。
线程之间的资源同步和信令:
在这个实现中,消费者线程应该休眠,直到没有队列有来自侦听器的数据。只有当生产者将数据放入任何一个队列时,消费者线程才应该唤醒。
使用互斥锁在 2 个线程之间同步多个队列。每当生产者将数据放入任何队列时,都会在线程之间实现事件信号以唤醒消费者线程。
然而,这种唤醒消费者线程的信号方式,尽管任何队列中有数据,消费者仍有可能进入睡眠状态。
问题:
让我们以这种情况为例,考虑消费者正在处理第 n 个队列的数据;同时,生产者有可能将数据放入 n-1、n-2 队列中,并且由于消费者处于清醒状态并正在处理第 n 个数据,因此信令无效。一旦消费者完成第 n 个队列数据的处理,它将进入休眠状态,并且在侦听器发出任何进一步的信号之前,不会处理 n-1、n-2 中的数据。
我们如何解决这种情况?人们还建议使用信号量。信号量与这种情况相关吗?
提前致谢。