1

我在 C++ 中有一个奇怪的问题,这段代码:

mutex_type  list_mutex;
typedef list<char*> RQueue;
RQueue rQueue;
RQueue::reverse_iterator  rstart, rend, last;

  1  while(true) {
  2      LockMutex(list_mutex);
  3      rstart = rQueue.rbegin();
  4      rend   = rQueue.rend();
  5      while( (rstart != rend) && (rstart != last) ) {
  6           print *rstart;
  7      }
  8      last = rQueue.rbegin(); 
  9      UnlockMutex(list_mutex);
  10  }
  • rQueue是一个队列,我在其中以相反的顺序迭代
  • rQueue可以随时接收消息
  • 我添加了迭代器last以避免在第 6 行重新处理接收消息
  • 在第 8 行,我保留了打印消息的位置,并且我只想打印比上一条消息更新的消息。

    我的问题:当迭代完成并在队列中添加新消息时,迭代器的值last会改变,与迭代器的值相同rstart,因此新到达的消息不会在第 6 行打印。

我不知道为什么last = rQueue.rbegin()在解锁队列后接收新元素时会修改其值。

谢谢。

4

1 回答 1

1

如果将迭代器设置为rbegin(),它将始终指向列表的最后一个元素。如果在后面添加另一个元素,迭代器将仍然指向最后一个元素(现在是新元素)。它不会改变,它只是一直指向终点。

我做了这个测试:

list<const char *> my_list;
my_list.push_back("msg 1");

list<const char*>::reverse_iterator it = my_list.rbegin();

cout << "Iterator is " << *it << endl;

my_list.push_back("msg 2");
my_list.push_back("msg 3");
my_list.push_back("msg 4");

cout << "Iterator is " << *it << endl;

该程序给出输出:

Iterator is msg 1
Iterator is msg 4

我有这个您可能会使用的其他解决方案,它不使用反向迭代器。相反,addMessage()-function 会更新read_pos为最新消息。如果read_pos不指向结尾,也不会改变。这允许printMessage()打印自上次运行以来添加的所有消息。

请注意,我仅在没有锁定的情况下对此进行了测试。

mutex_type  list_mutex;
typedef list<const char*> RQueue;
RQueue rQueue;

RQueue::iterator read_pos;

void addMessage(const char *message) {
    LockMutex(list_mutex);

    rQueue.push_back(message);

    if (rQueue.size() == 1) {
        read_pos = rQueue.begin();
    }
    else if (read_pos == rQueue.end()) {
        read_pos--;
    }

    UnlockMutex(list_mutex);
}

void printMessage() {
  RQueue::iterator prev_pos;

  while (true) {
    LockMutex(list_mutex);

    if (rQueue.size() == 0) {
          UnlockMutex(list_mutex);
          continue;
    }

    RQueue::iterator end = rQueue.end();
    while (read_pos != end) {
        cout << *read_pos << endl;
        read_pos++;
    }

    UnlockMutex(list_mutex);
  }
}
于 2013-11-08T18:01:51.097 回答