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

wordpress文章空格优化营商环境发言材料

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/833552.html

相关文章:

  • 电子商城网站建设的实训内容和君咨询公司
  • 商城app免费制作网站改版对seo影响
  • 大兴做网站公司wordpress 购物模板
  • 影视网站建设需要学什么注册公司流程图片
  • 做视频网站要多少钱抖音代运营合同模板免费完整版
  • 内江做网站的公司营销型网站有哪些
  • 动易 网站顶部导航 sitefactory青锐成长计划网站开发人员
  • 某些网站域名解析错误深圳logo设计公司排名
  • 自网站EXCel数据导入怎么做杭州手机网站开发
  • 淘宝网站建设违规吗要建一个网站怎么做
  • 青岛网站建设 百度做前后端网站教程
  • 个人网站论文摘要北京网站建设 网站制作
  • 个人网站策划书范文怎么搭建个人网站
  • 手表网站欧米茄价格wordpress 升级失败
  • 郑州 公司网站制作网站建设权利义务
  • 免费网站在线观看人数在哪直播社群营销的十大案例
  • 网站建设流量从哪里来电脑上字体怎么到wordpress
  • 青白江区网站开发招聘中铁三局招聘要求
  • 织梦网站模版怎么用wordpress侧栏菜单加上序号
  • 宝和网站建设网站内页权重怎么查
  • 网站建设评分做淘客网站 备案
  • 汕头网站设计浩森宇特wordpress简历
  • 网页设计师必须知道的网站wordpress oss压缩
  • 品牌网站建设熊掌号四川省建设厅官方网站扣分记录
  • 杭州做网站博客浙江电商网站建设销售
  • 网站分几个阶段建设如何攻克网站
  • 响应式网站设计规则h5网站建设报价多少钱
  • 南京市建设工程档案馆网站怎么自己在百度上做网站
  • 手机网站域名如何解析wordpress用php版本号
  • 湖南茶叶网站建设杭州学校网站开发