如何实现低延迟ConcurrentQueue?

时间:2017-04-21 22:10:26

标签: c++ multithreading performance concurrency queue

我已经对两个版本的并发队列进行了基准测试,一个是concurrency :: concurrent_queue< uint64_t>来自MSVC2015,另一个是手写版本

handwrittend版本非常简单,它使用std :: mutex + std :: queue

void push(T&& val)操作很简单:{_ m.lock(); _q.push(VAL); _m.unlock();}

bool try_pop(T& val)就像floolwing:{lock(); if(_queue.empty()){_ m.unlock();返回false; } else {T = _q.pop(); _m.unlock();返回true; }

它阻止互斥锁,检查队列是否为空,然后取消阻塞,如果是,则返回false,或指定T& val值,取消阻塞并返回true;

基准是多个编写器(例如:4核3770K上的16个线程)和单个最高优先级读取器;揭露多个客户的行为 - 单个人; bench具有固定的迭代次数(16M),因此每个线程编写器只存储当前时间戳(QueryPerformanceCounter()调用)1M次;

并且读者聚合时间增量(它在try_pop()上调用QueryPerformanceCounter()返回true;并计算时间差),并在完成时计算平均延迟(所有timeDeltas'总和除以迭代次数) 所以,我解释了一切,只是让我不要在这里粘贴整个代码;它很简单,我很懒,寻找代码(几天前,在另一台PC上),必须使用pastebin /无论如何..更好,我喜欢现在打印,你现在可以理解和回答,如果你知道它: )

我遇到了一个很奇怪的行为: 我的实现暴露了FAST整体处理(大约2s),但平均延迟为800ms(想想1s,取决于进程/线程优先级,后台进程,调试器的存在,等等) 和MS concurrency :: concurrent_queue实现暴露超低平均延迟(< 10ms,通常为1-2ms),但运行时间极高(不能完全记住,大约30-40s,我记得比约20-30倍慢)我的impl)

所以这就是问题 - 存在两种方法吗?一个用于最低延迟,另一个用于最低运行时间?或者你能说什么? 什么是低延迟方法? (我的意思是agorithmically,高度赞赏C / pseudocode样本) 如何写出councurrecny :: coucurrent_queue :: push()和try_pop()?

0 个答案:

没有答案