当前位置: 首页 > 知识库问答 >
问题:

C++/Boost模拟C#BlockingCollection?

栾峰
2023-03-14

我喜欢C#线程安全的BlockingCollection,它允许我使用TakeTryTake方法“阻止”直到新项目可用,例如阻止最大值1秒:OrderActions.TryTake(out oa,1000);

什么是blockingcollection的C++/boost模拟?

共有1个答案

鲁炳
2023-03-14

您可以使用Boost::LockFree库来实现所需的行为。在这种情况下,您可以在pop方法之上实现taketrytake

或者,您可以使用此答案,使用std::mutexstd::condition_variable来保护std::deque(答案是用C++11编写的,但您可以使用boost::thread从旧的编译器访问线程相关的内容)。

更新

template<typename PeriodT>
bool tryPop (T & v, PeriodT dur) {
    std::unique_lock<std::mutex> lock(this->d_mutex);
    if (!this->d_condition.wait_for(lock, dur, [=]{ return !this->d_queue.empty(); })) {
        return false;
    }
    v = std::move (this->d_queue.back());
    this->d_queue.pop_back();
    return true;
}    

例如,periodt可以是std::chrono::milliseconds。快速示例:

queue<int> p;
int v;
p.tryPop (v, std::chrono::milliseconds(1));
 类似资料:
  • 本书是对 Boost C++ 库的介绍,Boost 库通过加入一些在实践中非常有用的函数对 C++ 标准进行了补充。 由于 Boost C++ 库是基于 C++ 标准的,所以它们是使用最先进的 C++ 来实现的。 它们是平台独立的,并由于有一个大型的开发人员社区,它可以被包括 Windows 和 Linux 在内的许多操作系统所支持。 Boost C++ 库可以提升你作为一个 C++ 开发人员的生

  • 本节介绍与C Programming Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 .B, .answer-sheet{ display:none !important; } .Q a{ pointer-events: none; cursor: default; } C P

  • 问题内容: 我试图将库包含在我的项目中,并且一直面临着同样的问题。我在使用Codeblocks IDE的Ubuntu 12.10上,尝试手动读取站点上的说明来安装库,但是在头文件以及使用前需要构建的库中出现错误。 然后,我通过terminalby安装了库。此后,在我的代码块程序中,可以包含类似的标题,但是当我尝试包含Filesystem库的标题( )时,出现以下错误: 我不确定如何解决此错误(特别

  • 我正试图将库包括在我的项目中,并一直面临着同样的问题。我在使用Codeblocks IDE的Ubuntu12.10上,尝试手动安装库,阅读网站上的说明,但在使用库之前,得到了带有标题的错误以及要构建的错误。 然后,我通过terminalby

  • 问题内容: 假设具有以下CTE,这些CTE返回我已经拥有的某些树数据(邻接模型)的级别(取自Linq中的分层数据- options和performance): 我想知道通过使用C#而不是SQL进行递归是否会提高性能。假设我有一个IQueryable,其中Tree是表示层次结构表中条目的实体,谁能向我展示如何执行CTE与递归C#函数相同的工作?类似于以下内容: 看到使用lambda表达式很容易做到这

  • 我知道在C++中没有什么比虚拟模板方法更好的了,但似乎它正是我所需要的。有什么办法可以让我使用吗?我很感谢任何建议。 我想通过add方法将实体添加到向量中,这些实体需要是虚拟的,也需要模板,如何避免这种情况?