【发布时间】:2015-03-18 12:13:51
【问题描述】:
我在 c++ 参考和队列头文件中读到 queue.front() 函数返回一个参考。 queue.pop() 似乎删除了队列中的那个元素。
在我的例子中,队列存储字符串(消息)有一个类在队列中存储一些字符串,一些线程调用一个看起来像这样的函数
pthread_mutex_lock(&this->mutex);
while(this->TEMP.size() == 0){
usleep(10);
}
string line;
line = this->TEMP.front();
this->TEMP.pop();
pthread_mutex_unlock(&this->mutex);
return line;;
}
所以如果它是一个引用,那么调用该函数的线程将会死掉或者发生一些可怕的事情,因为内存在之前被 pop 释放了。
到目前为止我是对的吗???
那我该怎么做???
【问题讨论】:
-
在 C++ 中,定义变量并立即为其分配初始值是一种很好的风格:
std::string line = TEMP.front()。不需要先创建一个空字符串然后覆盖它。 -
你为什么拿着互斥锁睡觉?
this->TEMP.size()锁定时,其他线程如何更改它? -
IIRC 你应该为此使用条件变量。 (不确定,我不使用 pthreads)
标签: c++ multithreading memory stl queue