线程和互斥锁的用法有什么问题

时间:2018-08-01 13:29:38

标签: c++

我编写了一个用于学习c ++线程的测试项目,但是程序中发生了一些错误。

该代码是一个类提供的功能,该函数可以向容器添加数据,并且该数据将在线程中打印,而已打印的数据将从容器中删除。

那是代码:

#include <mutex>
#include <thread>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

class Manager
{
public:
    Manager() 
    {
        const auto expression = [&]()->void {return threadProc(); };
        thread(expression).detach();
    }
    ~Manager() {}

    void addData(int num)
    {
        if (m_data.lock())
            m_data.data.push_back(num);
    }

private:
    struct
    {
        vector<int> data;
        unique_lock<mutex> lock()
        {
            return unique_lock<mutex>(m);
        }
    private:
        mutex m;
    }m_data;

    void threadProc()
    {
        while (true)
        {
            if (m_data.lock())
            {
                for_each(m_data.data.begin(), m_data.data.end(), [](int num)
                {
                    cout << num << endl;
                });
                m_data.data.clear();
            }
        }
    }
};

int main()
{
    Manager manager;
    manager.addData(1);

    system("pause");
}

运行时,将显示

error info

您能告诉我问题出在哪里吗?谢谢!

1 个答案:

答案 0 :(得分:4)

unique_lock返回的临时lock()被立即销毁,从而解锁了互斥锁。实际上,对data的访问不受并发访问的保护。您的程序通过数据争用表现出未定义的行为。