我喜欢C#
线程安全BlockingCollection
的,它允许我“阻塞”直到有新项目可用,使用Take
和TryTake
方法,例如阻塞最大 1 秒:orderActions.TryTake(out oa, 1000);
什么是 c++ / boost 模拟BlockingCollection
?
您可以使用boost::lockfree库来实现所需的行为。在这种情况下,您可以在 pop 方法之上实现Take
和。TryTake
或者您可以使用这个答案来保护std::deque
和(用 C++11 编写的答案,但您可以使用std::mutex
boost ::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));