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差距很大,这是为什么呢?

3月9日提问
1 个回答
0

已采纳

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

撰写答案

推广链接