比较提升::无锁::spsc_queue、提升::无锁::队列、串行队列操作
compare among boost::lockfree::spsc_queue, boost::lockfree::queue, serial queue operation
我比较了这三种情况中使用的经过时间,它们是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 线程将锁锁定到队列的任何时间长度,则当音频线程保持在该锁处时,音频将出现故障。使用无锁队列允许音频线程执行对队列的调用,而不会陷入等待低优先级线程的困境。
相关文章:
- 内存排序在提升::无锁:队列
- ARM 上的无锁 SPSC 队列实现
- std::list 可以用于简单的无锁队列吗?
- 无锁队列实现中的虚假下溢C++
- Boost 无锁队列断言用于简单的赋值和析构函数
- 可以检查提升::无锁::队列是否已满吗?
- 两个提升的无锁队列会导致僵局
- 使用无锁指针队列在线程之间移动数据是否安全
- C++无锁队列与多个线程一起崩溃
- 为什么我的无锁消息队列段错误:(?
- 寻找对我的线程安全,无锁队列实施的批评
- 我可以放一个lambdas的无锁队列吗?
- 比较提升::无锁::spsc_queue、提升::无锁::队列、串行队列操作
- C++11 使用 std::atomic(多写入器,单使用者)的无锁队列
- Boost 的无锁队列是否有可能丢失元素?
- 在 Folly 的无锁 SPSC 队列中使用 std::memory_order_consume
- 可变长度的无锁队列
- 在fixed_sized<true>的情况下提高无锁队列行为
- 一个并发队列或8个无锁队列更快
- boost::Eigen的无锁队列::MatrixXf