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

What's Wrong with the usage of thread and mutex

本文关键字:什么 问题 线程      更新时间:2023-10-16

我写了一个学习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");
}

当它运行时,它将显示

错误信息

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

lock()返回的临时unique_lock立即被销毁,从而解锁互斥锁。事实上,对data的访问并没有受到并发访问的保护。您的程序以数据竞赛的方式表现出未定义的行为。