比较提升::无锁::spsc_queue、提升::无锁::队列、串行队列操作

compare among boost::lockfree::spsc_queue, boost::lockfree::queue, serial queue operation

本文关键字:队列 无锁 提升 操作 spsc 比较 queue      更新时间:2023-10-16

我比较了这三种情况中使用的经过时间,它们是boost::lockfree::queue,boost::lockfree::spsc_queue以及使用std::queue的生产者/消费者队列的串行代码。 我在"/apps/boost_1_56_0/libs/lockfree/examples"中编译并运行了"spsc_queue.cpp"、"queue.cpp"的提升示例代码,下面是生成/使用相同数量对象的串行代码。

boost::

lockfree::queue 生成/使用 400000000 个对象所花费的时间为 290 秒,而 boost::lockfree::spsc_queue(nowait 单个生产者队列和单个使用者队列)所花费的时间为 172.84 秒。没有多线程的代码只有 17.35 秒。我想知道使用多线程无锁队列有什么意义。这只是一个演示,可以同时访问这两个无锁队列吗?

#include <queue>
#include <iostream>

int producer_count = 0;
int consumer_count = 0;
std::queue<int> q;
const int iterations = 400000000;
void producer(void)
{
    for (int i = 0; i != iterations; ++i) {
        int value = ++producer_count;
        q.push(value);
    }
}
void consumer(void)
{
    int value;
    while (!q.empty()) {
        value = q.front();
        q.pop();
        ++consumer_count;
    }
}
int main(int argc, char* argv[])
{
    using namespace std;
    producer();
    consumer();
    cout << "produced " << producer_count << " objects." << endl;
    cout << "consumed " << consumer_count << " objects." << endl;
}

是的,你是对的!

可以在多线程环境中并发访问无锁队列,而不会产生任何数据争用。

    boost::
  • lockfree::spsc_queue:单个生成单个使用者队列
  • boost::
  • lockfree::queue:a multi producer multi consumer queue

http://www.boost.org/doc/libs/1_59_0/doc/html/lockfree.html

锁定队列在实时系统中很重要,以避免优先级倒置。例如,如果您正在制作音频应用程序,GUI 线程将需要与音频线程通信。如果使用带锁的队列,并且低优先级 GUI 线程将锁锁定到队列的任何时间长度,则当音频线程保持在该锁处时,音频将出现故障。使用无锁队列允许音频线程执行对队列的调用,而不会陷入等待低优先级线程的困境。