C++多线程写list的问题
偶然碰到了一个问题,在没有加锁的情况下,用两个线程写同一个List,当两个线程都结束之后,我在主线程中遍历list,并且输出list的size,发现只能打印list的一部分,和list的size完全不符,但是如果加了锁的话,就完全正常了,这就是我比较好奇的地方了,线程不安全是如何影响到list从而引发这种情况的呢?
#include "stdafx.h"
#include "list"
#include "iostream"
#include "thread"
#include "mutex"
using namespace std;
class msgList
{
private:
list<int>mylist;
mutex m;
int i = 0;
public:
void WriteList()
{
while(i<5000)
{
mylist.push_back(i++);
}
return;
}
void showList()
{
for (list<int>::iterator p = mylist.begin(); p != mylist.end(); p++)
{
cout << (*p) << " ";
}
cout << endl;
cout << "size of list : " << mylist.size() << endl;
return;
}
};
int main()
{
msgList mlist;
thread pwrite0(&msgList::WriteList, &mlist);
thread pwrite1(&msgList::WriteList, &mlist);
pwrite0.join();
pwrite1.join();
mlist.showList();
return 0;
}
输出结果:
如图所示,实际打印出来的元素个数与size差距很大,这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这种情况在多线程中很常见。list内部至少有三个重要的状态,begin,end,和size,在多个线程同时更新的时候出现不一致是很正常的