C++多线程写list的问题

发布于 2022-09-11 18:16:31 字数 1203 浏览 15 评论 0

偶然碰到了一个问题,在没有加锁的情况下,用两个线程写同一个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;
}

输出结果:
clipboard.png

如图所示,实际打印出来的元素个数与size差距很大,这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

°如果伤别离去 2022-09-18 18:16:31

这种情况在多线程中很常见。list内部至少有三个重要的状态,begin,end,和size,在多个线程同时更新的时候出现不一致是很正常的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文