std :: queue不保存数据

时间:2015-05-01 15:21:22

标签: c++ queue

这是我的两个班级:

class App {
public:
  void run(){
    std::vector < std::thread > th_list;
    for(std::vector < Host * > ::iterator it = host_list.begin(); it != host_list.end(); it++){
      th_list.push_back(std::thread(&App::th_getInfo, *this, *it, readFile(holder["cmdFile"])));
    }

    for(std::vector<std::thread>::iterator it = th_list.begin(); it != th_list.end(); it++){
      it->join();
    }
  }
private:
  void th_getInfo(Host * pc, std::string info){
    std::string result;
    if(pc->query(info, &result)){
      holder.Push(pc->getIp(), result);
    }
  }


  std::vector < Host * > host_list;
  Holder holder;
};

class Holder {
public:
  void Push(std::string ip, std::string data){
    _m.lock();
    std::pair <std::string, std::string> tmp(ip, data);
    q.push(tmp);
    std::cout << q.size() << std::endl;
    _m.unlock();
  }
  inline std::string &operator[] (std::string j){ return config[j]; }
private:
  std::map <std::string, std::string> config;
  std::mutex _m;
  std::queue < std::pair < std::string, std::string> > q;
}

所以,我的问题是每次调用函数Holder :: Push q.size()在开始时等于0,在此函数结束时等于1。推送的对象刚刚消失,但我不会调用q.pop()。

1 个答案:

答案 0 :(得分:0)

我认为这是你的问题:

th_list.push_back(std::thread(&App::th_getInfo, *this, *it, readFile(holder["cmdFile"])));

std :: thread按值获取参数;所以*这会创建一个App对象的副本,并带有一个单独的Holder。正如你和上帝所希望的那样,你可以像这样包装来获得参考语义:

th_list.push_back(std::thread(&App::th_getInfo, std::ref(*this), *it, readFile(holder["cmdFile"])));

有关类似问题,请参阅here;将调试打印放在App的复制构造函数中,每次创建线程时都应该看到它被调用。