我正在开发的应用程序有问题。
我有两个线程,Prod 和 Cons,它们分别写入和读取共享的Queue
. 这里都很标准。
此应用程序的目标是让 Prod 读取文件并将每一行添加到Queue
.Cons 必须读取这些行并成对“匹配”它们(遵循一些标准)。
问题是,为了让 Cons 发挥作用,它必须从 中“处理”几行, Queue
并且只删除那些形成 Pair 的行。例如,如果以下是Queue
Prod 填写的 Q:
Q:
-
A1
A2
B1
C1
D1
C2
D2
B2
E1
E2
缺点应该创建 Pairs (A1,A2),(B1,B2),(C1,C2) 等...(对的顺序是要求)。
我的问题是,要创建 Pair (B1,B2),Cons 需要首先分析 C1、D1、D2 和 C2 并发现它们与 B1 不匹配;然后找到 B2 并且 B1 和 B2 都必须从 Q 中删除,而不修改先前不匹配元素(C1、D1 等)的顺序。
目前,我通过 Cons 解决了始终从队列中删除第一个元素,如果不匹配,则将其保存在 Cons 的另一个内部队列中;当找到匹配的元素时,会创建 Pair 并将保存在内部队列中的所有元素“重新注入”到 Q 的头部(实际上是 a DeQue
)。
虽然这种方法适用于简单的情况,但它存在无可救药的缺陷。鉴于 Prod 一直在运行,很可能会发生这样的情况,当 Cons 删除不匹配的元素时,Prod 会添加新行,当 Cons 尝试在 Q 上重新插入消息时有效地产生死锁。
我还认为 Cons 只能“窥视” Q 中的元素并仅删除匹配的元素,但这意味着访问Deque
.
有人对这个问题有建议吗?我总是可以“创建”一个Deque
可以满足我需要的东西,但我真的不喜欢!太容易出错了...
谢谢!