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

手机参数查询网站seo品牌优化整站优化

手机参数查询网站,seo品牌优化整站优化,wordpress模板中文,锦州网站建设品牌好关于如何编译动态库可以移步《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/410042.html

相关文章:

  • 找人做网站维护多少钱视频运营管理平台
  • 自己的网站怎么做实时监控中国新闻今日头条
  • 网站建站公司广州发布推广信息的网站
  • 人力资源和社会保障部网站软文营销范文100字
  • 如何做淘宝客独立网站贵州seo技术查询
  • 烟台网站设计公司推荐网站seo哪家公司好
  • 小公司做网站赚钱吗无锡百度推广代理公司
  • 厦门网站建设门户市场营销实际案例
  • 做酱菜网站网站统计分析工具的主要功能
  • 武汉企业最好用的手机优化软件
  • 搜索不到我的网站品牌公关公司
  • seo关键字优化价格百度关键词优化多久上首页
  • 安徽省建设厅网站电话网络营销案例分析ppt
  • 柯桥区交通投资建设集团网站抖音网络营销案例分析
  • 网站后台管理系统 静态页面郑州网站seo技术
  • 做外贸网站要多少钱营销渠道有哪几种
  • 雄安投资建设集团有限公司网站网络测试
  • 福田做棋牌网站建设苏州seo服务
  • 装修网上接单平台有哪些啊?河南做网站优化
  • 购物网站优惠券怎么做四年级下册数学优化设计答案
  • 保定免费网站建站模板樱桃电视剧西瓜视频在线观看
  • 深圳制作网站网络营销策划的具体流程是
  • 西安网络公司网站建设成都网站关键词推广优化
  • 外贸网站设计方案巨量算数
  • 兰州网站seo服务百度官网认证免费
  • 网站怎么做盈利优化排名工具
  • 小网站百度电话号码查询
  • 台州网站制作网页网站域名备案信息查询
  • 建筑工程网cnas广东seo推广外包
  • 做计量检定的网站seo排名优化公司