【问题标题】:how do i deal with the queue front and pop function我如何处理队列前端和弹出功能
【发布时间】: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


【解决方案1】:

您正在呼叫line.operator=(std::string& source)。引用source 是从TEMP.front() 返回的引用初始化的。一旦该运算符返回,分配就完成了。您现在有两个字符串副本。在.pop 之后,原来的已经没有了,但line 仍然保有它的价值。

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2018-09-08
    • 2011-01-21
    • 2018-07-16
    • 2019-02-09
    • 2013-02-24
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多