905-Linux平台编译线程池动态库(死锁问题2)

Linux平台编译线程池动态库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译动态库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
怎么回事?
因为运行的时候系统都去这个路径找库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们这么做:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刷新配置文件:
在这里插入图片描述
在这里插入图片描述

怎么回事,在Windows跑没问题,在Linux跑却有问题?

在这里插入图片描述

gdb调试

调试一个正在运行的程序(发生死锁的进程)
在这里插入图片描述

线程池总共有5个线程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1号是主线程,线程池线程剩下4个。
在这里插入图片描述
我们查看线程调用堆栈,看到,线程池的线程都在wait
在这里插入图片描述
我们看到:
在这里插入图片描述
对应于我们看代码上的调用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题出在这里:
在这里插入图片描述
为什么会lock_wait了???不应该啊!!!notify为什么会造成wait???
在这里插入图片描述
我们现在切到线程3看看:
在这里插入图片描述
linux的thread库的条件变量为什么会lock住?

我们来分析看看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正常情况到这里是不能阻塞的,因为任务执行完要花3秒,但是主线程执行完
在这里插入图片描述
在这里插入图片描述
Result要析构,会调用其析构函数,其析构函数是默认的,也会析构它的成员变量
在这里插入图片描述
问题出现在信号量上
在这里插入图片描述
是默认析构的。意味着它的互斥锁和条件变量也进行默认的析构
在这里插入图片描述
现在出现的问题是:post函数的notify出现了阻塞
我们看看windows下条件变量的析构函数:
在这里插入图片描述
在windows的VS编译器下,条件变量析构会释放相应的资源
也就是说,任务的返回值,会调用result的post函数,此时cond已经析构了,所以notify相当于什么也没做,不会阻塞,任务没有任何问题!!!

但是linux下condition_variable的析构函数什么也没做!!!
在这里插入图片描述
在这里插入图片描述
所以,得出结论:
在这里插入图片描述

在Linux上代码如何修改?

在这里插入图片描述
重新编译so库,重新运行
在这里插入图片描述
在这里插入图片描述
解决!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值