请教一个关于C++线程锁的问题,为什么这样会出错呢?

light7866 2018-08-01 06:11:56
这是代码,一个比较简单的测试工程,添加一个数据,然后在线程中打印添加的数据
#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");
}

请大神帮忙解答一下
...全文
301 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2018-08-08
  • 打赏
  • 举报
回复
m_data.lock()执行完后构造的unique_lock就析构了,锁也释放了,后面的m_data.data.push_back(num)就管不着了。
cjzzmdn 2018-08-06
  • 打赏
  • 举报
回复
楼主 我试了下下面的代码,认为你的代码由于, 临时变量自动析构了,并不能一个线程存数,一个线程打印
std::mutex mtx;
unique_lock<mutex> lock()
{
return unique_lock<mutex>(mtx);
}
void print_block (int n, char c) {
unique_lock<mutex> mmm;
if(lock())//使用这句 注掉下面一句 * $ 混在一起
//if(mmm=lock())//使用这句 注掉上面一句 * $ 不混在一起
{
for (int i=0; i<n; ++i) { std::cout << c; }
std::cout << '\n';
}
}

int main2 ()
{
std::thread th1 (print_block,500,'*');
std::thread th2 (print_block,500,'$');

th1.join();
th2.join();

return 0;
}
赵4老师 2018-08-02
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
kbasm 2018-08-01
  • 打赏
  • 举报
回复
点重试按钮,进入调试状态,然后从调用栈找到出错代码
light7866 2018-08-01
  • 打赏
  • 举报
回复
错误截图是这样的

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧