【发布时间】:2021-08-30 03:36:03
【问题描述】:
我最近开始学习多线程,所以我还是不明白一些东西。我试图编写一个线程安全的队列,但我怀疑我是否做对了一切。由于我没有注意到我的错误,如果您向我指出错误,我会很高兴。谢谢您的反馈! 另外,我不确定我在这段代码中是否正确使用了条件变量。
template<class T>
class SafeQueue {
private:
std:: queue<T> _data;
pthread_mutex_t _mutex;
pthread_cond_t _condition;
public:
SafeQueue();
~SafeQueue();
void push(const T &x);
T front();
T back();
void pop();
int size();
bool empty();
};
template<class T>
SafeQueue<T>::SafeQueue(){
pthread_mutex_init(&_mutex, NULL);
pthread_cond_init(&_condition, NULL);
}
template<class T>
SafeQueue<T>::~SafeQueue(){
pthread_mutex_destroy(&_mutex);
pthread_cond_destroy(&_condition);
}
template<class T>
void SafeQueue<T>::push(const T &x){
pthread_mutex_lock(&_mutex);
_data.push(x);
pthread_cond_signal(&_condition);
pthread_mutex_unlock(&_mutex);
}
template<class T>
T SafeQueue<T>::front(){
pthread_mutex_lock(&_mutex);
if(_data.empty() && _data.size() == 0){
pthread_mutex_unlock(&_mutex);
throw SafeQueueException("Queue is empty");
}
if(_data.empty()){
pthread_cond_wait(&_condition, &_mutex);
}
T temp = _data.front();
pthread_mutex_unlock(&_mutex);
return temp;
}
template<class T>
T SafeQueue<T>::back(){
pthread_mutex_lock(&_mutex);
if(_data.empty() && _data.size() == 0){
pthread_mutex_unlock(&_mutex);
throw SafeQueueException("Queue is empty");
}
if(_data.empty()){
pthread_cond_wait(&_condition, &_mutex);
}
T temp = _data.back();
pthread_mutex_unlock(&_mutex);
return temp;
}
template<class T>
void SafeQueue<T>::pop(){
pthread_mutex_lock(&_mutex);
if(_data.empty() && _data.size() == 0){
pthread_mutex_unlock(&_mutex);
throw SafeQueueException("Queue is empty");
}
if(_data.empty()){
pthread_cond_wait(&_condition, &_mutex);
}
_data.pop();
pthread_mutex_unlock(&_mutex);
}
template<class T>
int SafeQueue<T>::size(){
pthread_mutex_lock(&_mutex);
int temp = _data.size();
pthread_mutex_unlock(&_mutex);
return temp;
}
template<class T>
bool SafeQueue<T>::empty(){
pthread_mutex_lock(&_mutex);
bool temp = _data.empty();
pthread_mutex_unlock(&_mutex);
return temp;
}
【问题讨论】:
-
对于工作代码的评论有codereview.stackexchange.com
标签: c++ multithreading pthreads