0
我试图做一个简单的程序,以了解线程和并发在C++中。我创建了一个名为MyQueue的模板类,它实现了一个队列和一些变量来处理线程的同步。C++:deque的迭代器不dereferencable
类只有两个函数来获取,并把项目从队列和一个函数来关闭队列,并避免进一步的访问。
程序编译得很好,但在调试时,它得到了以下错误:
表达:deque的迭代器不dereferencable
这可不管什么线程正在做的发生,如果get或put项目。
下面是代码:
template <class T> class MyQueue{
queue<T> myqueue;
int N;
bool open;
mutex m,m_open;
condition_variable cv,cv2;
public:
MyQueue(int size){
N=size;
open=true;
}
bool isOpen(){
lock_guard<mutex> lg(m_open);
return open;
}
void close(){
lock_guard<mutex> lg(m_open);
open=false;
cv.notify_all();
cv2.notify_all();
}
bool get(T &t){
if(isOpen()==false)return false;
if(myqueue.size()>0){
{
lock_guard<mutex> lg(m);
t=myqueue.front();
myqueue.pop();
cv.notify_one();
}
}else{
unique_lock<mutex> ul(m);
cv2.wait(ul);
if(!isOpen()) return false;
t=myqueue.front();
myqueue.pop();
cv.notify_one();
}
return true;
}
bool put(T t){
if(!isOpen())return false;
if(myqueue.size()<N){
{
lock_guard<mutex> lg(m);
myqueue.push(t);
cv2.notify_one();
}
}else{
unique_lock<mutex> ul(m);
cv.wait(ul);
if(!isOpen())return false;
myqueue.push(t);
cv2.notify_one();
}
return true;
}
};
你通常得到,当你试图derefrence一个无效指针错误,请确保您的队列中有数据和迭代器试图遵从之前有效。 – dchhetri 2013-04-10 18:23:13
线程是邪恶的,但你测试大小之前并不需要一个锁?你可以测试规模,发现它是一个但在此之前,你可以删除任何其他线程已经到来,并且在队列中删除的唯一项目。 – john 2013-04-10 18:26:41
@john线程不是邪恶的。他们无动于衷。 :) – 2013-04-10 18:35:34