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

南岸区网站建设小程序商店助手

南岸区网站建设,小程序商店助手,针对餐饮公司推广做网站方法,小说网站开发对影成三人小说一:概述 如果一个线程被 detach() 了,那么它的生命周期将独立于创建它的作用域。因此,该线程只能安全地访问: 全局变量(global/static objects)堆上分配的对象(free-store allocated objects&a…

一:概述

        如果一个线程被 detach() 了,那么它的生命周期将独立于创建它的作用域。因此,该线程只能安全地访问:

  1. 全局变量(global/static objects)
  2. 堆上分配的对象(free-store allocated objects,即 new / make_unique() 创建的对象) 其他作用域的对象可能会在线程访问它们之前被销毁,导致 悬空指针(dangling pointer) 和 未定义行为。

二:示例代码

        下面以一段代码来介绍下前面说的这种情况:

#include <iostream>
#include <thread>
#include <memory>void f(int* p) {*p = 99;  // 可能访问悬空指针
}int glob = 33;  // 全局变量void some_fct(int* p) {int x = 77;std::thread t0(f, &x);         // 错误!x 是局部变量std::thread t1(f, p);          // 错误!p 可能指向局部变量std::thread t2(f, &glob);      // OK!glob 是全局变量auto q = std::make_unique<int>(99);std::thread t3(f, q.get());    // 错误!q 在 some_fct 结束时销毁t0.detach();t1.detach();t2.detach();t3.detach();
}

    在这段代码中,线程detach后,会有以下几种情况发生:

  1. t0(f, &x);t1(f, p);

    • xsome_fct() 的局部变量,p 可能指向局部变量。
    • t0t1 可能会在 some_fct() 结束后访问已销毁的变量,导致 未定义行为。
  2. t3(f, q.get());

    • qmake_unique<int>(99) 创建的智能指针,q.get() 获取的指针在 some_fct() 结束时无效。
    • std::unique_ptr 在函数返回时析构,导致 t3 访问无效内存。
  3. t2(f, &glob);

    • 由于 glob 是全局变量,它的生命周期足够长,可以安全地被 t2 访问。

三:解决方案

        如何避免线程detach后的空悬指针和未定义行为?有以下两种方案:

        1. 只使用全局变量或堆分配的对象

#include <iostream>
#include <thread>
#include <memory>void f(int* p) {*p = 99;
}int glob = 33;void some_fct(int* p) {auto q = new int(99);   // 使用堆对象std::thread t1(f, &glob);  // OK,全局变量std::thread t2(f, q);      // OK,堆上分配的对象t1.detach();t2.detach();// 需要手动释放 q,避免内存泄漏delete q;
}

       2. 避免 detach(),使用 std::thread::join()joining_thread

void some_fct() {int x = 77;std::thread t(f, &x);  // OK,因为 t.join() 之前 x 一直有效t.join();              // 等待线程结束,确保不会访问销毁的对象
}
class joining_thread {std::thread t;
public:template <typename... Args>explicit joining_thread(Args&&... args) : t(std::forward<Args>(args)...) {}~joining_thread() {if (t.joinable()) {t.join();}}
};void some_fct() {int x = 77;joining_thread t(f, &x);  //  OK
}

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

相关文章:

  • 彩票网站怎么做赚钱吗html编辑器的使用方法
  • wordpress有多少网站江苏省城乡与建设厅网站
  • 建网站要注意的细节阿里云建站中级版和高级版
  • 网站建设与推广合肥今天的北京新闻
  • 学校网站建设要点网站建设费用自建
  • 宁波自助建站模板上海公司黄页
  • 深圳罗湖企业网站推广做爰网站
  • 常州建站公司模板国内品牌设计公司
  • 下载asp做网站珠宝wordpress主题
  • wordpress中英网站插件最彻底的手机优化软件
  • 网站文章要求东北大学秦皇岛吧
  • 网站 建设 计划书私人小工厂做网站价格
  • 自己做采集电影网站韩城建设局网站
  • 企业网站 asp.net安徽海绵城市建设协会网站
  • 巴基斯坦人做网站怎么样贵州省住房和城乡建设网站
  • 沧州 网站建设网站优化 英文
  • 经营网站icp备案要求安阳县面积
  • 网站搭建什么意思亚马逊网站开发者平台
  • 如何做网站赚钱6建设网站需要虚拟空间
  • wordpress升级数据库谷歌seo推广服务
  • 做一个线上app多少钱seo两个域名一个网站有影响
  • 自助餐团购网站建设网络推广方案七步法
  • 做美工需要哪些网站WordPress公众号主题
  • 免费域名网站黄华辰合肥企业展厅设计公司
  • 微信做淘宝优惠券但网站是怎么建设但xampp上传Wordpress
  • 关闭WordPress文章摘要朝阳区seo搜索引擎优化怎么样
  • 嘉兴手机网站公司网站是如何搭建的
  • 长沙网站制作公司推荐个人网页设计与制作教程
  • 拜博网站建设做视频网站是什么职业
  • 盗版系统网站怎么建立怎样做网站标题的图标