我比较了这三种情况中使用的时间,它们是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;
}
答案 0 :(得分:0)
是的,你是对的!
可以在多线程环境中同时访问lockfree队列,而不会产生任何数据争用。
答案 1 :(得分:0)
锁定免费队列在实时系统中很重要,以避免优先级倒置。例如,如果您正在制作音频应用程序,则GUI线程将需要与音频线程进行通信。如果使用具有锁的队列,并且低优先级GUI线程在任何时间长度内保持对队列的锁定,则当音频线程被保持在该锁定时,音频将出现故障。使用无锁队列允许音频线程对队列进行调用,而不会卡在等待低优先级线程。