两个具有共享缓冲区的等待线程(生产者/消费者)

2024-05-04

我试图让一堆生产者线程等待,直到缓冲区有空间容纳某个项目,然后将项目放入缓冲区,如果没有更多空间,则返回睡眠状态。

同时应该有一堆消费者线程等待,直到缓冲区中有东西,然后尽可能地从缓冲区中获取东西,如果缓冲区为空则返回睡眠状态。

在伪代码中,这就是我正在做的事情,但我得到的只是死锁。

condition_variable cvAdd;
condition_variable cvTake;
mutex smtx;

ProducerThread(){
    while(has something to produce){

         unique_lock<mutex> lock(smtx);
         while(buffer is full){
            cvAdd.wait(lock);
         }
         AddStuffToBuffer();
         cvTake.notify_one();
    }
}

ConsumerThread(){

     while(should be taking data){

        unique_lock<mutex> lock(smtx);
        while( buffer is empty ){
            cvTake.wait(lock);
        }   
        TakeStuffFromBuffer();
        if(BufferIsEmpty)
        cvAdd.notify_one();
     }

}

另一个值得一提的错误是,您的消费者仅在缓冲区变空时通知等待的生产者。

仅当队列已满时才通知消费者的最佳方式。

E.g.:

template<class T, size_t MaxQueueSize>
class Queue
{
    std::condition_variable consumer_, producer_;
    std::mutex mutex_;
    using unique_lock = std::unique_lock<std::mutex>;

    std::queue<T> queue_;

public:
    template<class U>
    void push_back(U&& item) {
        unique_lock lock(mutex_);
        while(MaxQueueSize == queue_.size())
            producer_.wait(lock);
        queue_.push(std::forward<U>(item));
        consumer_.notify_one();
    }

    T pop_front() {
        unique_lock lock(mutex_);
        while(queue_.empty())
            consumer_.wait(lock);
        auto full = MaxQueueSize == queue_.size();
        auto item = queue_.front();
        queue_.pop();
        if(full)
            producer_.notify_all();
        return item;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个具有共享缓冲区的等待线程(生产者/消费者) 的相关文章

随机推荐

  • 在 iOS 9 上,所有 uitableviewcell 的高度都变成一行

    我有一个带有多个 UITableView 控制器的应用程序 在 iOS 8 x 上运行 每个表格中所有单元格的高度将调整大小以适合单元格的内容 所有单元格仅包含纯文本的 UILabel 现在 在 iOS 9 上运行时 每个表格上的每个单元格
  • Java - 线程“主”中的异常 java.util.ConcurrentModificationException

    有什么办法可以修改HashMap迭代特定键时的值 下面给出一个示例程序 public static void main String args HashMap
  • javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication

    我开发了一个 Spring boot 应用程序 该应用程序的功能运行良好 但是 在启动时 我多次看到以下异常 当我几周前运行相同的应用程序时 我没有看到任何此类异常 此后代码库没有改变 我想知道它是否与环境有关 我发帖的原因是我想更多地了解
  • 能够删除特定约束的增量 SMT 求解器

    是否有增量 SMT 求解器或用于某些增量 SMT 求解器的 API 我可以在其中增量添加约束 在其中我可以通过某个标签 名称唯一地标识每个约束 我想唯一地标识约束的原因是这样我可以稍后通过指定标签 名称来删除它们 需要放弃约束是因为我之前的
  • 对 Qsort 和指针感到困惑

    我是一名 C 初学者程序员 想要习惯术语和指针 我在寻找对数值数组元素进行排序的方法时发现了以下工作函数原型 该函数是 qsort 它使用指针 现在我的理解是 const 一词确保值 a 和 b 不变 但指针不变 如果我在这里错了 请纠正我
  • Xcode 4.6.2 应用程序每秒运行一次就会崩溃

    Xcode 4 6 2 似乎有很多 bug 当我第二次跑步时any项目我在第一秒内就发生 SIGABRT 崩溃 我完全删除了 Xcode 并重新安装 是的 我尝试关闭然后再次打开 我还删除了命令行工具和模拟器 但这也没有帮助 好的 我找到了
  • 使用 Volley 时出现 SSL 异常

    我在 Android 中使用 Volley 来执行我的应用程序请求 不幸的是 我收到以下错误 com android volley NoConnectionError javax net ssl SSLHandshakeException
  • #pragma 指令是否依赖于编译器?

    我知道并且我用过 pragma startup and pragma exit之前 但当我执行以下代码时 它仅输出In main 谁能告诉我这里发生了什么事 include
  • XPCOM是什么? XPCOM 与 COM?

    我无法理解 XPCOM 它与 COM 有什么不同 是什么让它跨平台 它是一个包含一组可用于完成某些工作的库的框架吗 另外 组件对象模型是否意味着每个功能都在组件中实现 因此我们可以在不知道详细实现的情况下使用它 你能帮我理解这一点吗 谢谢
  • 为什么向列表<>添加新值会覆盖列表<>中以前的值

    我本质上是试图将多个项目添加到列表中 但最后所有项目的值都等于最后一个项目 public class Tag public string TagName get set List
  • Java 6 内存使用过多

    对于大型应用程序 Java 6 消耗的内存是否比您预期的要多 我有一个已经开发多年的应用程序 到目前为止 在我的特定测试配置中 该应用程序占用了大约 30 40 MB 的空间 现在 对于 Java 6u10 和 11 活动时需要数百个时间
  • 如果 POST 成功但没有创建任何新内容,我们应该返回什么状态代码?

    我们有一个端点 当您发布创建新版本的资源时 它会返回 201 和新创建的资源的位置 它根据当前版本和发布的版本 使用类似 semver 的规则集 的比较来确定新版本号 如果您发布的版本与现有版本相同 则不会更新版本号 在这种情况下我们应该返
  • Windows 10 上具有 kernel32.dll 的 Dependency Walker

    我尝试打开kernel32 dll在 Windows 10 上使用 Dependency Walker 我收到以下错误和警告 错误 未找到至少一个所需的隐式或转发依赖项 警告 至少未找到一个延迟加载依赖模块 Screenshot 我运行的是
  • 强制 Scala 特征实现某种方法

    有没有办法指定特征必须提供方法的具体实现 给定一些 mixin class A extends B with C foo 如果出现以下任一情况 程序将编译A B or C实施foo 但是我们如何才能强制 例如 B包含装有foo的实施 您可以
  • 装饰器错误:NoneType 对象不可调用

    我写了一个这样的函数装饰器 def tsfunc func def wrappedFunc print s called func name return func return wrappedFunc tsfunc def foo pas
  • Android 多点触控:ACTION_UP 并不总是被调用?

    我开发了一个在视图中处理多点触控的 Android 应用程序 我基本上跟踪可能发生的几个 MotionEvent 例如 ACTION UP ACTION MOVE 我在 View 类中覆盖的 onTouch 方法如下所示 public bo
  • Kafka 0.8.2 中是否可以向现有主题添加分区

    我有一个Kafka https kafka apache org 集群运行有 2 个分区 我一直在寻找一种将分区计数增加到 3 的方法 但是 我不想丢失有关该主题的现有消息 我尝试停下来Kafka https kafka apache or
  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • 从应用服务中运行的 .net core 应用程序发送日志以进行日志分析

    我尝试寻找 net core 2 0 应用程序将应用程序日志发送到日志分析工作区的最简单方法 该应用程序在azure中的应用服务下运行 我尝试启用 诊断设置 并将日志存档到日志分析 但是 我没有在 AppServiceHTTPLogs 中看
  • 两个具有共享缓冲区的等待线程(生产者/消费者)

    我试图让一堆生产者线程等待 直到缓冲区有空间容纳某个项目 然后将项目放入缓冲区 如果没有更多空间 则返回睡眠状态 同时应该有一堆消费者线程等待 直到缓冲区中有东西 然后尽可能地从缓冲区中获取东西 如果缓冲区为空则返回睡眠状态 在伪代码中 这