【发布时间】:2016-03-29 20:17:44
【问题描述】:
我正在尝试了解 boost.org 中的队列示例。具体来说最简单的,单生产者单消费者队列。考虑下面的代码。
为什么 consumer_count 是原子的而不是 producer_count?它们都在各自的线程中发生变化。
在声明队列的那一行为什么尖括号中有一个常数?我认为在构造 foo<bar> 中,bar 只是 foo 的修饰符,例如 Vector<double>。我知道它正在设置队列的大小,但为什么像普通函数调用那样使用尖括号而不是括号?
查看生产者中 for 循环中的空 while 循环。如果队列已满,则 push 函数返回 false。这会不会进入无限循环?
我不明白无锁的概念。什么是锁?
为什么消费者中有2个while pop循环?
如果生产者和消费者以相同的优先级同时运行,队列的大小应该悬停在 0 或 1 附近,对吧?还是它会填满然后一遍又一遍地倾倒?
在加入消费者线程之前,在 main 中设置了 Done。我很困惑。这段代码接近尾声的事件顺序是什么?
#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;
}
【问题讨论】:
-
一篇文章中有太多问题。你肯定需要一些关于 C++/Boost 的书。
标签: c++ multithreading boost queue