正如标题所示,这是使用信号量的生产者/消费者实现。
没有死锁问题,但似乎只要消费者想要删除队列中的下一个项目,它总是尾巴。
的伪代码:
class Consumer {
while (!q.isEmpty() || !dataRead())
{
empty.acquire();
mutex.acquire();
queue.remove();
mutex.release();
full.release();
}
synchronized (caller)
{
caller.dataWritten = true;
caller.notify();
}
}
class Producer {
for (int i=0; i < 100; i++)
{
full.acquire();
mutex.acquire();
queue.add(i);
mutex.release();
empty.release();
}
...also notify Consumer that we're done...
}
class MainThread {
...
new Thread(new Producer(args)).start();
new Thread(new Consumer(args)).start();
synchronized (this) {
while (!dataWritten())
wait();
...
}
输出看起来像这样:
显然,当我移除头部时,我期望移除处于相同的顺序(FIFO)。
我正在使用ConcurrentLinkedQueue实现,但已尝试过许多其他实现,如LinkedList,BlockingQueue实现等。
另外,我试图在队列对象上进行同步,并在沟渠工作中使变量也变得不稳定,但它并没有什么区别。
我认为它与对队列的陈旧引用有关,但已经没有想法尝试。
编辑:输出的问题是,当消耗了项目0时,它应该消耗值0而不是1,因为这是为项目0生成的。
我似乎无法使用最少的代码进行复制。
似乎数据来自迭代器需要花费少量时间来读取信息,输出关闭(如我的例子中所示),但如果我只是推入一些常量值,则输出是正确的。由于只有1个制作人,为什么这会产生影响呢?
答案 0 :(得分:0)
我不确定,如果我正确解释程序的输出。我假设Item x指的是你在生产者的for循环中递增的整数。如何设置值字段的值?
由于您首先将项目0添加到队列中,而项目0是您使用的第一个项目,因此队列的行为对我来说似乎是正确的。