4

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

什么是 c++ / boost 模拟BlockingCollection

4

1 回答 1

5

您可以使用boost::lockfree库来实现所需的行为。在这种情况下,您可以在 pop 方法之上实现Take和。TryTake

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

更新

实际上我不推荐第一种方法,因为它会扼杀无锁容器的整个想法:) 所以,第二种情况TryTake (tryPop)可以用下面的代码来实现(只是例子)

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));
于 2013-09-27T06:16:00.667 回答