我尝试过构建一个简单的生产者/消费者程序的实验。它们在单独的线程中运行。生产者生成一些数据,消费者在另一个线程中获取它。我实现的消息传递延迟约为 100 纳秒。谁能告诉我这是否合理或者是否有更快的实现?
我没有使用锁......只是简单的内存计数器。我的实验描述如下:
http://tradexoft.wordpress.com/2012/10/22/how-to-move-data- Between-threads-in-100-nanoseconds/ http://tradexoft.wordpress.com/2012/10/22/how-to-move-data-between-threads-in-100-nanoseconds/
基本上,消费者等待计数器增加,然后调用处理函数。所以代码真的不多。但我还是很惊讶它花了 100 纳秒。
消费者看起来像这样:
void operator()()
{
while (true)
{
while (w_cnt==r_cnt) {};
auto rc=process_data(data);
r_cnt++;
if (!rc)
break;
}
}
当生产者有可用数据时,只需增加 w_cnt 即可。
有更快的方法吗?
我想你的延迟是操作系统如何安排上下文切换的产物,而不是自旋锁本身,我怀疑你对此能做些什么。
但是,您可以使用环形缓冲区一次移动更多数据。如果一个线程写入,一个线程读取,则可以实现无锁的环形缓冲区。本质上,这将是相同的自旋锁方法(等到tailidx != headidx
),但生产者可以在将多个值切换到消费者之前将多个值泵入缓冲区。这应该会改善您的整体延迟(但不会改善单值延迟)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)