我编写了一个用于学习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");
}
运行时,将显示
您能告诉我问题出在哪里吗?谢谢!
答案 0 :(得分:4)
由unique_lock
返回的临时lock()
被立即销毁,从而解锁了互斥锁。实际上,对data
的访问不受并发访问的保护。您的程序通过数据争用表现出未定义的行为。