Является ли такая реализация queue потокобезопасной?
Смотрела похожие вопросы, но мне надо сделать queue из stl потокобезопасной, используя mutex из pthread.h. Является ли такая реализация потокобезопасной?
#pragma once
#include <iostream>
#include <pthread.h>
#include <queue>
template <typename T>
class thread_safety_queue
{
private:
std::queue<T> _queue;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
public:
thread_safety_queue(){};
void push(const T& data) {
pthread_mutex_lock(&mutex);
_queue.push(data);
pthread_mutex_unlock(&mutex);
}
bool empty() {
pthread_mutex_lock(&mutex);
bool temp = _queue.empty();
pthread_mutex_unlock(&mutex);
return temp;
};
void pop(){
pthread_mutex_lock(&mutex);
_queue.pop();
pthread_mutex_unlock(&mutex);
};
T& front(){
pthread_mutex_lock(&mutex);
T& temp = _queue.front();
pthread_mutex_unlock(&mutex);
return temp;
}
T& back(){
pthread_mutex_lock(&mutex);
T& temp = _queue.back();
pthread_mutex_unlock(&mutex);
return temp;
};
};
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
Нет конечно. Давайте рассмотрим такой код (типичный для очереди)
thread_safety_queue<int> qu;
while (!qu.empty()) {
auto t = qu.front();
process(t);
qu.pop();
}
и запустим с двух и больше потоков. И оно упадет. Потому что очередь может быть не пустой в условии, но при попытке взять элемент уже может быть пустой (другой поток уже удалил последний элемент, обрабатывая pop.
плюс ко всему, зачем использовать pthread_mutex_lock/pthread_mutex_unlock, если в стандартной библиотеке уже есть мютекс с поддержкой RAII?