我在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()
在解锁队列后接收新元素时会修改其值。
感谢。
答案 0 :(得分:0)
如果将迭代器设置为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()
- 函数会将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);
}
}