2013-04-10 83 views
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; 
} 

}; 
+1

你通常得到,当你试图derefrence一个无效指针错误,请确保您的队列中有数据和迭代器试图遵从之前有效。 – dchhetri 2013-04-10 18:23:13

+0

线程是邪恶的,但你测试大小之前并不需要一个锁?你可以测试规模,发现它是一个但在此之前,你可以删除任何其他线程已经到来,并且在队列中删除的唯一项目。 – john 2013-04-10 18:26:41

+0

@john线程不是邪恶的。他们无动于衷。 :) – 2013-04-10 18:35:34

回答

0

我解决了这个由等待改变get和put函数来wait_for。 例如,在得到:

if(!cv.wait_for(lock, std::chrono::milliseconds(2100), [this] { return !myQueue.empty();})) return false;

这样线程等待一段时间,只是设定量调用myQueue.empty()并不需要一个适当的锁(如答案的建议)。