gpt4 book ai didi

c - 具有循环缓冲区的同步生产者和消费者

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:07 24 4
gpt4 key购买 nike

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

生产者的速度可能明显慢于或快于消费者,这是随机的。

我们想要的是

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

  2. 相反,如果消费者比生产者更快,它必须等待新帧并在新帧出现时使用它。

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

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

非常感谢。

最佳答案

基本上,当消费者速度慢时,意味着没有人在使用缓冲区,因此丢弃新帧和覆盖旧帧之间没有区别。所以也许下面的代码可以提供帮助。 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();
}

};

关于c - 具有循环缓冲区的同步生产者和消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1567519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com