這是使用VS 2010 concurent隊列典型的生產者/消費者模式,問題是,當我運行該程序,內存消耗撞過來1GB然後程序崩潰,可有人請點在這個代碼中解決這個問題?concurrent_queue內存消耗爆炸,然後程序崩潰
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <boost\shared_ptr.hpp>
#include <boost\thread.hpp>
#include <concurrent_queue.h>
void wait2(int milliseconds)
{
boost::this_thread::sleep(boost::posix_time::milliseconds(milliseconds));
}
class CQueue
{
Concurrency::concurrent_queue<int> Q;
boost::mutex m;
boost::condition_variable cv;
public:
CQueue():QValue(-1)
{
}
int QRead()
{
while(Q.empty())
{
boost::unique_lock<boost::mutex> lk(m);
cv.wait(lk);
}
int res;
if(Q.try_pop(res))
{
QValue = res;
return true;
}
return false;
}
void QWrite(int i)
{
Q.push(i);
cv.notify_one();
}
int QValue;
};
CQueue myqueue;
void write()
{
int i = 0;
while(true)
{
myqueue.QWrite(++i);
}
}
void read()
{
while(true)
{
if(myqueue.QRead())
std::cout << myqueue.QValue << std::endl;
else
std::cout << "failed to read" << std::endl;
}
}
void main()
{
boost::thread w(write);
boost::thread r(read);
w.join();
r.join();
}
無明顯死鎖。由於讀者正在執行I/O操作,因此作者可能比閱讀器耗盡速度快得多。 – Casey
爲什麼你把'unique_lock'放在一個範圍內,你知道你會在鎖關閉的時候從隊列中讀取,對吧?爲什麼當你有一個concurrent_queue時你在做這些事情? – yngccc
@Casey你應該有權利,因爲通常生產者/消費者模式需要指定每個消費者的容量(閾值在他們的輸入fifo),以阻止生產者,直到有人準備好或有存儲。 – alexbuisson