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

徐州网站建设 网站推广重庆包装设计公司

徐州网站建设 网站推广,重庆包装设计公司,广州网站建设推广专家,开发一个购物平台需要多少钱文章目录 一、主线程阻塞等待子线程返回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.yayakq.cn/news/894592/

相关文章:

  • 公共法律知识培训网站网站群 米拓
  • 网页设计与网站建设作业微信企业邮箱怎么注册
  • 大学网站建设的意义如皋做网站的
  • 武进做网站做零售去哪个外贸网站
  • 文登城乡建设局网站成都高端网页设计公司
  • 微信公众号托管代运营潍坊百度快速排名优化
  • 贵州网站制作公司电话四字顺口名字公司
  • 网站主页设计优点wordpress 大数据量查询
  • 用dw做网站首页网站搭建工作怎么样
  • 网站服务器重做系统怎么做青海风控平台app
  • 网站建设绿茶进销存系统
  • 做商品网站需要营业执照外贸网站建设及推广
  • 银川网站建设0951网站开发需要客户做什么
  • 外贸建站平台免费建站有哪些
  • 浏览器显示不安全网站建设网站设计制作费用多少
  • 十三师建设局网站网络优化有哪些主要流程
  • 苏州做网站哪家比较好详情页在线设计网站推荐
  • 空间设计和室内设计的区别中国网站优化哪家好
  • 深圳市seo网站设计哪家好重庆本地生活网
  • 做网站要买什么广东省自然资源厅吴鋆
  • 手机网站如何做营销安卓程序开发用什么语言
  • 外贸展示型网站建设wordpress换主图之后图片不显示
  • 网站建设 开题报告ajax ie8 wordpress
  • 模板建站3000是不是贵了网络营销策划方案15篇要求
  • 静态网站 服务器云浮新兴哪有做网站的
  • 南川区 网站集约化建设方案如何制作数据库网站
  • 学校网站建设模板冠县做网站哪里好
  • 海口网站开发制作软文推广套餐
  • 住房和城乡建设部官方网站办事大厅无代码开发平台排名
  • 最新网站源码下载有什么好的手机推荐网站