многопоточность — C ++: итератор deque не может быть разыменован

Я пытаюсь сделать простую программу, чтобы узнать о потоках и параллелизма в C ++. Я создал шаблонный класс с именем MyQueue, который реализует очередь и некоторые переменные для обработки синхронизации потоков.

Класс имеет всего две функции для получения и помещения элементов из очереди и одну функцию для закрытия очереди и предотвращения дальнейшего доступа.

Программа компилируется просто отлично, но при отладке выдает следующую ошибку:

Выражение: итератор deque не разыменовывается

Это может произойти независимо от того, что делает поток, если получить или положить элементы.

Вот код:

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;
}

};

0

Решение

Я решил это, переключившись с wait на wait_for в функциях get и put.
Например, в get:

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

таким образом потоки ждут только установленное количество времени, и вызов myQueue.empty () не требует надлежащей блокировки (как предложено в ответах).

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector