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

海宁高端网站设计成都基金品牌设计

海宁高端网站设计,成都基金品牌设计,合肥做网站123cms,模型评测网站怎么做文章目录 一、主线程阻塞等待子线程返回1、代码示例2、代码改进 一、主线程阻塞等待子线程返回 主线程等待一个线程,此线程会开始连接一个服务器并循环读取服务器存储的值,主线程会阻塞直到连接服务器成功。因为如果不阻塞,可能上层业务刚开…

文章目录

        • 一、主线程阻塞等待子线程返回
          • 1、代码示例
          • 2、代码改进

一、主线程阻塞等待子线程返回

主线程等待一个线程,此线程会开始连接一个服务器并循环读取服务器存储的值,主线程会阻塞直到连接服务器成功。因为如果不阻塞,可能上层业务刚开始读不到数据。

1、代码示例
bool bConnect = false;  // 退出条件void connectAndReadFromServer()
{// 模拟等待2秒连接服务器成功Sleep(2000);bConnect = true;// 模拟一个无限循环读取服务器数据while (true){qDebug() << "I am working";Sleep(1000);}
}int main(int argc, char *argv[])
{std::thread t(connectAndReadFromServer);// 阻塞等待子线程返回,该方式在debug下运行ok,release下不会阻塞。while (!bConnect){}qDebug() << "main thread continue, start read " << bConnect;return 0;
}

坑点:上述代码在debug下运行是没有问题的,因为编译器会关闭大部分优化,目的是保留代码的原始行为,方便调试。 但是在release模式下,编译器发现该循环内部无任何操作,会采取循环消除优化,直接跳过,主线程继续执行,所以此时bConnect为false。

2、代码改进
int num = 0;
while (!bConnect)
{Sleep(0);   // ok 正常阻塞//空函数(); // no 直接优化去掉//num++;  // no bConnect条件拿不到
}
  • Sleep(0) :主动放弃CPU时间片,重新线程调度,还可以刷新主线程的寄存器和缓存,让线程重新从内存中读取变量的最新值。
  • 空函数() :在release下,该循环不执行,直接被编译器优化掉。
  • 变量++:就算连接成功,编译器也会在release下优化,bConnect条件变量的值被缓存到寄存器中(因为要大量循环读),导致主线程无法感知到变量的变化。循环一直执行。所以可以给变量num加volatile关键字,这样也是可以正常阻塞的,通知编译器不要优化该变量,每次都从内存中读取最新的值。
http://www.15wanjia.com/news/196138.html

相关文章:

  • 教育视频网站开发济南网站怎么做
  • 农业建设项目管理信息系统网站网络广告网站
  • dw免费网站模板下载舟山网站网站建设
  • 站长工具搜索深圳html5网站开发
  • 网站开发使用天气api河北建设工程信息网招标公告秦皇岛北戴河华北疗养院
  • 会展免费网站模板网站推广怎么做2017
  • 电信备案网站iis7安装wordpress
  • 网站建设金手指15wordpress 好吗知乎
  • 移动网站建设是什么庆阳网站建设
  • 长沙手机网站设计成都网站设计制作价格
  • 建网站费用会计分录网址管理系统
  • 上海做网站定制上海百度推广官方电话
  • 上海做网站的公司是什么神兵网站建设
  • 简单网站制作教程wordpress弹出聊天
  • ftp网站建设本溪兼职网站建设招聘
  • 手机app软件seolxw
  • 网站推广商品怎么做效果最好二手车出口外贸流程
  • 网站开发中应注意哪些问题样式表一般用于大型网站
  • 企业网站管理系统带授权办公室装修设计app
  • 中国做的电脑系统下载网站好做橙光游戏的网站
  • 一篇网站设计小结深圳网站建设制作厂家
  • 白云做网站的公网站的数据备份和恢复
  • 做网站用什么系统事业单位可以建设网站吗
  • 企业网站建设专业t购物网站开发前景
  • 哪家能建设网站上海网站分站建设
  • 帆客建设网站wordpress换域名
  • 淘宝客网站里面catid=16网站的登录弹窗怎么做
  • 农村网站建设调查报告湘潭网站建设 就问磐石网络专业
  • 申请免费网站多少钱哪有学电脑培训班
  • 星月网络公司做的网站企业网站建设专业公司