当前位置: 首页 > wzjs >正文

佛山企业快速建站小程序与手机网站区别

佛山企业快速建站,小程序与手机网站区别,北京优酷首页培训机构,千网图片关于如何编译动态库可以移步《Linux:动态库动态链接与静态库静态链接》-CSDN博客 我们写的线程池代码是闭源的,未来想提供给别人使用,只需要提供so库和头文件即可。 系统默认库文件路径为: usr/lib usr/loacl/lib 系统默认头文件…

关于如何编译动态库可以移步《Linux:动态库动态链接与静态库静态链接》-CSDN博客

我们写的线程池代码是闭源的,未来想提供给别人使用,只需要提供so库和头文件即可。

系统默认库文件路径为:

usr/lib usr/loacl/lib

系统默认头文件路径为:

usr/include usr/local/include

g++ -fPIC -shared threadpool.cpp -o libtbpool.so -std=c++17sudo mv libtbpool.so /usr/local/lib
sudo mv threadpool.h /usr/local/includeg++ 线程池测试项目.cpp -ltdpool -lpthread//修改/ect/ld.so.conf.d/
//将库文件路径放进/ect/ld.so.conf.d/
//ldconfig更新缓存路径即可

在windows下运行好好的程序,在Linux下怎么又会发生死锁呢?

gdb attatch 线程id

info threads:查看当前程序所有线程信息,包括线程ID、线程状态等。看到四个线程好像都在阻塞等待“in __lll_lock_wait”。

thread 5进入五号线程,bt查看线程5堆栈信息。

thread 3进入3号线程,bt查看线程3堆栈信息。

可以看到,在post()函数里notify_all()阻塞了。也就是在线程在Result得到返回结果之后,唤醒notify_all()用户接收线程执行完任务的返回值的时候阻塞了。

// 实现一个信号量类
class Semaphore
{
public:Semaphore(int limit = 0):resLimit_(limit){}// 获取一个信号量资源void wait(){// 等待信号量有资源,没有资源,会阻塞当前线程std::unique_lock<std::mutex> lock(mtx_);cond_.wait(lock, [&]()->bool {return resLimit_ > 0; });resLimit_--;}// 增加一个信号量资源void post(){std::unique_lock<std::mutex> lock(mtx_);resLimit_++;cond_.notify_all();}private:int resLimit_;// 初始信号量资源个数std::mutex mtx_;std::condition_variable cond_;
};

来分析一下原因。

Linux上,这些Result对象也是局部对象,是要析构的!

执行任务也是需要花费时间的,但是主线程提交完任务,它才不管任务有没有执行完呢。出了作用域Result对象就析构了。

Result对象会调用它自己的析构函数析构。

Result对象成员变量就要析构,问题出现在Semaphore上,来看一下Semaphore的析构函数,也是默认的,那么mutex和condition_variable也会默认析构。

既然问题出现在cond这个条件变量上,我们来看一下cond系统是怎么实现的。

可以看到在VS下,条件变量析构会释放相应的资源的。

所以Result对象接收完任务的返回值,然后调用Result的sem信号量的sem_.post()函数,但是Result对象出了作用域以后就析构了,Semaphore也就析构了,所以在调用sem_.post()的时候,cond已经析构了,cond_.notify_all()这里啥也没做,不会阻塞,任务正常结束。

那么,我们猜测Linux下g++的库,条件变量析构没有释放相应的资源。

可以看到,Linux下条件变量的析构函数没有做任何事情。

Result对象出了作用域以后,就析构了,Semaphore也要析构,mutex和condition_variable变量也要析构,但是g++库里condtition_variable没有做任何事情,使用了一个已经出了生命周期的对象。

改起来也很简单:

// 实现一个信号量类
class Semaphore
{
public:Semaphore(int limit = 0):resLimit_(limit),isExit_(false){}~Semaphore(){isExit_ = true;}// 获取一个信号量资源void wait(){if(isExit_)true;// 等待信号量有资源,没有资源,会阻塞当前线程std::unique_lock<std::mutex> lock(mtx_);cond_.wait(lock, [&]()->bool {return resLimit_ > 0; });resLimit_--;}// 增加一个信号量资源void post(){if(isExit_)true;std::unique_lock<std::mutex> lock(mtx_);resLimit_++;cond_.notify_all();}private:std::atomic_bool isExit_;int resLimit_;// 初始信号量资源个数std::mutex mtx_;std::condition_variable cond_;
};

再去测试就没什么问题了。这样就解决了线程池在Linux下死锁的问题。 

http://www.dtcms.com/wzjs/575294.html

相关文章:

  • 赣州网站推广哪家最专业网站开发技术前景最好
  • 广告公司可以做网站吗嘉兴制作网站
  • 广州优化网站建设做电影下载网站成本
  • 进一步推进网站集约化建设为什么做的网站预览出来什么都没有
  • 自己做网站上市旅游网站建设模块
  • 会计上大额网站费如何做分录什么是百度权重
  • 机关网站建设工程总结烟台市芝罘区住房和建设局网站
  • 北京住房建设厅网站免费网页代理在线
  • 电影网站制作教程简单风景网站模版
  • 国内小程序开发公司搜索引擎推广与优化
  • 电子商务网站建设与维护书南昌网站建设精英
  • 购物网站怎么运营推广app制作免费平台
  • 视频上传网站源码wordpress离线文章发布
  • python网站开发案例莱州双语网站
  • 网站开发包括优秀手机网站欣赏
  • 橙色大气风格网站模板镇江平台搭建
  • 湖北公司网站建设多少钱个人介绍网站怎么做
  • 网站运营需要哪些技术网络平台
  • 网站建设的市场容量做网站的详细流程
  • 在万网上域名了怎么做网站网站空间与服务器的区别
  • 企业的门户网站一般用什么做建设网站怎么设置网站页面大小
  • 长春市科学技术局网站信主网站
  • 网站怎么建立汕尾建设局安检站网站
  • 游戏动漫设计与制作seo整站优化+WordPress
  • 济南制作网站联合易网做网站
  • 做长图的网站网站是哪个建站公司做的
  • 平安区wap网站建设公司东莞市官网网站建设怎么样
  • wdcp创建网站做财经直播网站
  • php微网站开发node.js网站开发框架
  • 要加强县门户网站的建设管理办法网站建设公司如何发展