gpt4 book ai didi

c++ - 试图理解 boost 队列示例

转载 作者:行者123 更新时间:2023-11-28 02:09:20 26 4
gpt4 key购买 nike

<分区>

我正在尝试理解来自 boost.org 的队列示例。具体最简单的,单生产者单消费者队列。考虑下面的代码。

为什么 consumer_count 是原子的而不是 producer_count?它们都在自己的线程中发生变化。

在声明队列的那一行为什么尖括号中有一个常量?我想在构造foo<bar> , bar 只是 foo 的修饰符,例如 Vector<double> .我知道它正在设置队列的大小,但为什么要像普通函数调用那样使用尖括号而不是圆括号?

查看 producer 中 for 循环中的空 while 循环。如果队列已满,推送函数返回 false。这会不会进入无限循环?

我不明白无锁的概念。什么是锁?

为什么consumer中有2个while pop循环?

如果生产者和消费者以相同的优先级同时运行,队列的大小应该徘徊在 0 或 1 附近,对吗?还是填满然后倾倒一遍又一遍?

在加入消费者线程之前,在 main 中设置完成。我很困惑。此代码末尾附近的事件顺序是什么?

#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
#include <iostream>
#include <boost/atomic.hpp>
int producer_count = 0;
boost::atomic_int consumer_count (0);
boost::lockfree::spsc_queue<int, boost::lockfree::capacity<1024> > spsc_queue;
const int iterations = 10000000;
void producer(void)
{
for (int i = 0; i != iterations; ++i) {
int value = ++producer_count;
while (!spsc_queue.push(value));
}
}
boost::atomic<bool> done (false);
void consumer(void)
{
int value;
while (!done) {
while (spsc_queue.pop(value)) ++consumer_count;
}

while (spsc_queue.pop(value)) ++consumer_count;
}
int main(int argc, char* argv[]) {
using namespace std;
cout << "boost::lockfree::queue is ";
if (!spsc_queue.is_lock_free()) cout << "not ";
cout << "lockfree" << endl;

boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);

producer_thread.join();
done = true;
consumer_thread.join();

cout << "produced " << producer_count << " objects." << endl;
cout << "consumed " << consumer_count << " objects." << endl;
}

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com