这是在 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);
}
关于c++ - 使用 pthreads 的线程安全队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31144949/