2

我有一个生产者和一个消费者。生产者在给定的共享内存区域上写入固定大小的项目,消费者检索它们。

生产者可能比消费者明显慢或快,随机的。

我们想要的是

  1. 如果生产者的运行速度比消费者快,当它填充循环缓冲区时,它会继续写入最旧的帧(当然,除了消费者正在消费的帧 - 我强调这一点,生产者和消费者必须同步解决方案,因为它们是不相关的过程)。

  2. 相反,如果消费者比生产者快,它必须等待一个新的帧并在它在那里时消费它。

我找到了带有循环缓冲区的生产者/消费者的实现,但只有那些不尊重第一个请求的实现(即,如果循环缓冲区已满,它们会等待消费者完成,而我想要的是覆盖最旧的帧)。

我不想推出自己的(容易出现错误)解决方案,而是使用预先罐装的、经过测试的解决方案。有人可以指出一个好的 C 实现吗?(C++ 也可以)。

非常感谢。

4

2 回答 2

0

基本上当消费者很慢时,这意味着没有人在使用缓冲区,因此丢弃新帧和覆盖旧帧没有区别。所以也许下面的代码可以提供帮助。producerRTLock 无法锁定缓冲区,因为有消费者使用缓冲区,因此在应用程序级别,您可以指示丢弃帧。

class SampleSynchronizer {

  mutex mux;

  condition_variable con_cond;
  unsigned int con_num;

  condition_variable pro_cond;
  bool prod;

public:

  SampleSynchronizer(): con_num(0), prod(false) {
  } 

  void consumerLock() {
    unique_lock<mutex> locker(mux);
    while(prod)
      pro_cond.wait(locker);

    con_num++;
  }

  void consumerUnlock() {
    lock_guard<mutex> locker(mux);
    con_num--;
    con_cond.notify_one();
  }

  void producerLock() {
    unique_lock<mutex> locker(mux);
    while(con_num > 0)
      con_cond.wait(locker);

    prod = true;
  }

  bool producerRTLock() {
    lock_guard<mutex> locker(mux);
    if(con_num > 0)
      return false;

    prod = true;
    return true;
  }

  void producerUnlock() {
    lock_guard<mutex> locker(mux);
    prod = false;
    pro_cond.notify_all();
  }

};
于 2014-11-18T22:33:45.433 回答
-1

听起来您想使用C++标准模板库 (STL)中提供的双端队列。 但这使用 C++,而不是 C。如果您的生产者和消费者是不同的线程,那么您还需要一个互斥锁来保护队列结构。

于 2009-10-14T17:08:29.640 回答