首页 > 其他分享 >等待线程完成

等待线程完成

时间:2024-03-24 20:58:19浏览次数:25  
标签:func 函数 thread int 线程 完成 等待

 如果不等待线程, 就必须保证线程结束之前, 可访问的数据得有效性。  这种情况很可能发生在线程还没结束, 函数已经退出的时候, 这时线程函数还持有函数局部变量的指针或引用。  

struct func
{
    int& i;
    func(int& i_) : i(i_) {}
    void operator() ()
    {
        for (unsigned j=0 ; j<1000000 ; ++j)
        {
            do_something(i); // 1. 潜在访问隐患: 悬空引用
        }
    }
};
void oops()
{
    int some_local_state=0;
    func my_func(some_local_state);
    std::thread my_thread(my_func);
    my_thread.detach(); // 2. 不等待线程结束
} // 3. 新线程可能还在运行

 这个例子中, 已经决定不等待线程结束(使用了detach()②), 所以当oops()函数执行完成时③, 新线程中的函数可能还在运行。 如果线程还在运行, 它就会去调用do_something(i)函数①, 这时就会访问已经销毁的变量。 

 如果需要等待线程, 相关的 std::thread 实例需要使用join()。 将 my_thread.detach() 替换为 my_thread.join() , 就可以确保局部变量在线程完成后, 才被销毁。 

 

标签:func,函数,thread,int,线程,完成,等待
From: https://www.cnblogs.com/love-9/p/18092998

相关文章

  • 特殊情况下的等待
     当倾向于在无异常的情况下使用join()时,需要在异常处理过程中调用join(),从而避免生命周期的问题。 structfunc;//定义在清单2.1中voidf(){intsome_local_state=0;funcmy_func(some_local_state);std::threadt(my_func);try{do_s......
  • 线程启动
     线程在std::thread对象创建(为线程指定任务)时启动。最简单的情况下,任务也会很简单,通常是无参数无返回(void-returning)的函数 。 使用C++线程库启动线程,可以归结为构造std::thread对象: voiddo_some_work();std::threadmy_thread(do_some_work);为了让编译器识......
  • 内核睡眠机制和等待队列
    内核睡眠机制:进程通过睡眠机制释放处理器,使其能够处理其他线程。处理器睡眠的原因可能在于感知数据可用性,或等待资源释放内核调度器管理要运行的任务列表,这被称为运行队列。睡眠进程不再被调度,因为已将它们从运行队列中移除了。除非改变状态(唤醒),否则睡眠进程将永远不会被执行。......
  • 简易的取款多线程
    首先建立一个classAccount类,设置全局变量money,这个变量会被所有的线程使用。设置条件。classAccount{publicstaticintmoney=3000;//建立全局变量publicsynchronizedvoidtaking(intm){if(m>money){System.out.println("余额不足");}else{System.out.pr......
  • 完成量completion
    基本概念:completion(完成)机制是一种同步原语,用于在线程间实现等待和通知的机制。它提供了一种方式,允许一个线程等待其他线程的完成,并在完成时通知等待线程。在Linux内核中,structcompletion表示completion对象。它包含一个计数器和一个等待队列,以及相关的操作函数。通常情况......
  • JAVAEE——多线程的设计模式,生产消费模型,阻塞队列
    文章目录多线程设计模式什么是设计模式单例模式饿汉模式懒汉模式线程安全问题懒汉模式就一定安全吗?锁引发的效率问题jvm的优化引起的安全问题阻塞队列阻塞队列是什么?生产消费者模型阻塞队列实现消费生产者模型可能遇到的异常多线程设计模式什么是设计模式首先我......
  • 【C++】Linux多线程开发
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录3.1线程概述3.2创建线程3.3、线程终止3.4连接已经终止线程3.5线程的分离3.6线程取消3.7线程属性3.8线程同步3.9互斥锁3.10死锁3.11读写锁3.12生产者和消费者模型3.13条件......
  • 后缀数组学习笔记(未完成
    后缀数组定义与实现定义后缀从字符串某个位置i到字符串末尾的子串,定义s的第i个字符为第一个元素的后缀为suf(i)。后缀数组把s的每一个后缀按照字典序排序,后缀数组sa[i]表示排名为i的后缀的起始位置的下标。rk[i]数组代表起始位置为i的后缀的排名。rk[]和sa[]是一一对应关系......
  • Java面试题:用Java并发工具类,实现一个线程安全的单例模式;使用Java并发工具包和并发框架
    面试题一:设计一个Java并发工具类,实现一个线程安全的单例模式,并说明其工作原理。题目描述:请设计一个Java并发工具类,实现一个线程安全的单例模式。要求使用Java内存模型、原子操作、以及Java并发工具包中的相关工具。考察重点:对Java内存模型的理解。对Java并发工具包的了......
  • Linux线程互斥
    文章目录Linux线程互斥mutex接口初始化互斥量销毁互斥量加锁和解锁加锁解锁的原理使用示例Linux线程互斥进程线程间的互斥相关背景概念临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有......