簡體   English   中英

帶 pthread 的線程安全隊列

[英]Thread-safe queue with pthreads

這是在 C++ 中實現線程安全隊列的正確方法嗎? 我有多個線程不斷地將項目入隊和出隊,直到發生某種情況,在此期間我“停止”了隊列。 謝謝

#include <queue>
#include <pthread.h>

template <typename T>
class ThreadSafeQueue {

private:
    std::queue<T> _queue;
    pthread_mutex_t queueMutex;
    pthread_cond_t emptyCondVar;

public:
    ThreadSafeQueue();

    bool volatile Stopped;

    void Enqueue(T data);
    T Dequeue();
    void StopQueue();
    void DestroyQueue();
};

template <typename T>
ThreadSafeQueue<T>::ThreadSafeQueue() {
    pthread_mutex_init(&queueMutex, NULL);
    pthread_cond_init(&emptyCondVar, NULL);
    Stopped = false;
}

template <typename T>
void ThreadSafeQueue<T>::Enqueue(T data) {
    pthread_mutex_lock(&queueMutex);
    _queue.push(data);
    pthread_cond_signal(&emptyCondVar);
    pthread_mutex_unlock(&queueMutex);

}

template <typename T>
T ThreadSafeQueue<T>::Dequeue() {

    pthread_mutex_lock(&queueMutex);
    if (_queue.empty()) {
        pthread_cond_wait(&emptyCondVar, &queueMutex);
    }
    if (Stopped) {
        pthread_mutex_unlock(&queueMutex);
        return NULL;
    }

    T elem = _queue.front();
    _queue.pop();
    pthread_mutex_unlock(&queueMutex);
    return elem;
}

template <typename T>
void ThreadSafeQueue<T>::StopQueue() {  
    pthread_mutex_lock(&queueMutex);
    Stopped = true;
    pthread_cond_broadcast(&emptyCondVar);
    pthread_mutex_unlock(&queueMutex);
}

template <typename T>
void ThreadSafeQueue<T>::DestroyQueue() {   
    pthread_mutex_lock(&queueMutex);
    _queue = std::queue<T>();
    pthread_mutex_unlock(&queueMutex);
}

您的Dequeue需要在pthread_cond_wait()上循環:

while (_queue.empty() && !Stopped) {
    pthread_cond_wait(&emptyCondVar, &queueMutex);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM