[英]C++ :deque iterator not dereferencable
我正在尝试做一个简单的程序来了解C ++中的线程和并发性。 我创建了一个名为MyQueue的模板类,该类实现一个队列和一些变量来处理线程的同步。
该类只有两个从队列中获取和放入项目的函数,以及一个关闭队列并避免进一步访问的函数。
该程序可以正常编译,但是在调试时会出现以下错误:
表达式:双端队列迭代器不可取消
无论线程在做什么,无论是获取还是放置项目,都可能发生这种情况。
这是代码:
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;
}
};
我通过将get和put函数中的wait更改为wait_for来解决此问题。 例如在get中:
if(!cv.wait_for(lock, std::chrono::milliseconds(2100), [this] { return !myQueue.empty();})) return false;
这样,线程仅等待设置的时间,并且调用myQueue.empty()不需要适当的锁定(如答案中所建议)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.