比较boost :: lockfree :: spsc_queue,boost :: lockfree :: queue,串行队列操作

时间:2015-04-15 22:29:10

标签: c++ multithreading boost

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

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;
}

2 个答案:

答案 0 :(得分:0)

是的,你是对的!

可以在多线程环境中同时访问lockfree队列,而不会产生任何数据争用。

  • boost :: lockfree :: spsc_queue:单个生产单个消费者队列
  • boost :: lockfree :: queue:多生产者多消费者队列

MDN Documentation

答案 1 :(得分:0)

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