Является ли такая реализация 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?

→ Ссылка