使用信号量的制作人/消费者。消费者得到尾巴,而不是排队

时间:2014-06-23 13:36:52

标签: java multithreading queue producer-consumer

正如标题所示,这是使用信号量的生产者/消费者实现。

没有死锁问题,但似乎只要消费者想要删除队列中的下一个项目,它总是尾巴。

的伪代码:

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();
 ...
 }

输出看起来像这样:

  • 项目0产生...值0.
  • 第1项产生......价值1.
  • 项目0消耗...值1.
  • 第1项消耗......价值1。

显然,当我移除头部时,我期望移除处于相同的顺序(FIFO)。

我正在使用ConcurrentLinkedQueue实现,但已尝试过许多其他实现,如LinkedList,BlockingQueue实现等。

另外,我试图在队列对象上进行同步,并在沟渠工作中使变量也变得不稳定,但它并没有什么区别。

我认为它与对队列的陈旧引用有关,但已经没有想法尝试。

编辑:输出的问题是,当消耗了项目0时,它应该消耗值0而不是1,因为这是为项目0生成的。

我似乎无法使用最少的代码进行复制。

似乎数据来自迭代器需要花费少量时间来读取信息,输出关闭(如我的例子中所示),但如果我只是推入一些常量值,则输出是正确的。由于只有1个制作人,为什么这会产生影响呢?

1 个答案:

答案 0 :(得分:0)

我不确定,如果我正确解释程序的输出。我假设Item x指的是你在生产者的for循环中递增的整数。如何设置值字段的值?

由于您首先将项目0添加到队列中,而项目0是您使用的第一个项目,因此队列的行为对我来说似乎是正确的。

相关问题