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

南岸区网站建设8月4号建设部网站

南岸区网站建设,8月4号建设部网站,汉鼎宇佑建设投资网站,宝应做网站一:概述 如果一个线程被 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/567053.html

相关文章:

  • 在线代理访问网站的网址php做的直播网站
  • 厦门优化网站排名产品设计公司有哪些
  • 人才招聘网站模板企业品牌网站制作
  • 互联网创意网站有哪些网站底部怎么做需要放些什么
  • 南宁网站建设产品介绍贵阳网站建设包首页
  • 网站开发的心得手机网站在后台怎么做编辑
  • 品牌推广战略wordpress seo教程网
  • 网站的种类有哪些新闻类网站备案 100万
  • 无证做音频网站违法吗网站建设的七个步骤
  • 免费建网站讨论网站建设需要哪些功能
  • 网站源码下载炫酷线上推广平台报价
  • 张家界有没有做网站的公司创建一个网站的条件有哪些
  • 自助建站会出现什么问题网站数据库安全
  • 遵义祥云平台网站建设网站后台验证码不显示
  • 上海模板建站哪家好wordpress小工具导入
  • wordpress 中文网店怎样进行站点优化
  • 忒低网站长怎么做怎么做本地化网站
  • 娱乐城网站建设网址查询ip地址
  • 网站建设论文linux河南省城乡与住房建设厅网站
  • 网站运维可以做哪些html编辑器哪个软件好用
  • 最新的购物网站 开公司网站html模板
  • 网站技术方案说明本地搭建的wordpress上传到主机
  • 国内最好的网站建设网站推广效果
  • 东莞网站建设aj工作室哪家云服务器性价比高
  • 如何用html在公司的网站上添加栏目路径织梦网站模版官网
  • 有哪些好的网站建设公司广州白云区
  • 山东卓创 网站建设前端网站怎么做
  • 东阿网站建设产品wordpress编辑器 下载地址
  • 做网站要有策划么如何做公司网站的
  • 怀柔网站建设推广关键字搜索引擎