c++ std::thread join/detach用法

ByteRhapsody
• 阅读 2015

detach

分离线程,将对象表示的线程与调用线程分离,允许它们彼此独立执行。
两个线程在没有阻塞或同步的情况下继续运行。注意,当任何一个结束执行时,它的资源都会被释放。让被创建的线程为后台线程,否则主线程退出时,如果子线程没有退出则异常。

#include <iostream>
#include <thread>
using namespace std;
void func1() {
    cout << "func1" << endl;
}
void func2() {
    cout << "func2" << endl;
}
int main() {
    thread t1(func1);
    thread t2(func2);
    return 0;
}

如果直接执行上面的程序,会报错:
c++ std::thread join/detach用法

void func1() {
    std::cout << "func1" << std::endl;
}
void func2() {
    std::cout << "func2" << std::endl;
}

分离后,则正常:

std::thread t1(func1);
t1.detach();
std::thread t2(func2);
t2.detach();

join

在上面的情况中,一般使用join来解决:

#include <iostream>
#include <thread>
using namespace std;
void func1() {
    cout << "func1" << endl;
}
void func2() {
    cout << "func2" << endl;
}
int main() {
    thread t1(func1);
    t1.join();
    thread t2(func2);
    t2.join();
    return 0;
}

但是还是有可能还是会出现问题,异常情况下可能会存在资源泄露的问题,利用c++的rall机制,可以在析构函数中join,自定义线程类:

#include <iostream>
#include <thread>
using namespace std;
class my_thread {
public:
    my_thread(std::thread& t) :thread_(t) {}

    ~my_thread() {
        if (thread_.joinable()) {
            std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
            thread_.join();
        }
    }

    my_thread(const my_thread& t) = delete;
    my_thread& operator = (const my_thread&) = delete;

private:
    std::thread& thread_;
};
void func1() {
    cout << "func1" << endl;
}
void func2() {
    cout << "func2" << endl;
}
int main() {
    
    thread t1(func1);
    my_thread my(t1);
    thread t2(func2);
    my_thread my2(t2);
    return 0;
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java多线程的3种实现方式
多线程相关的问题1.什么是进程?​正在执行的程序2.什么是线程?​进程的子单位,一个能够完成独立功能的执行路径3.为什么需要开启多线程?当执行某些耗时操作的任务的时候需要开启多线程,防止线程阻塞能够让两个任务看起来像是在同时执行
浩浩 浩浩
4年前
android 面试题总结
Java部分一、多线程 Join() 线程加入,执行此方法的线程优先使用cpu Yeild() 线程释放资源使所有线程能有相等的机会使用cpu Sleep()相当于让线程睡眠,交出CPU,让CPU去执行其他的任务(不会释放锁)。Wait()方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
Wesley13 Wesley13
3年前
Java多线程并发控制工具CountDownLatch,实现原理及案例
闭锁(CountDownLatch)是Java多线程并发中的一种同步器,它是JDK内置的同步器。通过它可以定义一个倒计数器,当倒计数器的值大于0时,所有调用await方法的线程都会等待。而调用countDown方法则可以让倒计数器的值减一,当倒计数器值为0时所有等待的线程都将继续往下执行。闭锁的主要应用场景是让某个或某些线程在某个运行节点上等待N个条件都
Wesley13 Wesley13
3年前
Java CyclicBarrier介绍
CyclicBarrier(周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的
Wesley13 Wesley13
3年前
Java中User Thread和Daemon Thread的区别
Java将线程分为User线程和Daemon线程两种。通常Daemon线程用来为User线程提供某些服务。程序的main()方法线程是一个User进程。User进程创建的进程为User进程。当所有的User线程结束后,JVM才会结束。通过在一个线程对象上调用setDaemon(true),可以将user线程创建的线程明确地设置成Daemon线程。例如,时
Wesley13 Wesley13
3年前
linux线程基本编程
索引:1.创建线程pthread\_create2.等待线程结束pthread\_join3.分离线程pthread\_detach4.创建线程键pthread\_key\_create5.删除线程键pthread\_key\_delete6.设置线程数据pthread\_setspecific7.获取线程数据pth
Wesley13 Wesley13
3年前
Java多线程
JavaThread状态NEW创建被创建,但是还没有开始的线程,也就是还没有调用start()方法。RUNNABLE运行就绪可运行状态,在JVM中执行,但是可能等待操作系统CPU资源。BLOCKED阻塞线程阻塞等
Wesley13 Wesley13
3年前
Java多线程锁释放
Java多线程运行环境中,在哪些情况下会使对象锁释放?由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的。在以下情况下,持有锁的线程会释放锁:(1)执行完同步代码块,就会释放锁。(synchronized)(2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。(exc
Wesley13 Wesley13
3年前
Java BIO
同步与异步,阻塞与非阻塞同步:当前线程发起了一个调用或请求,然后当前线程需要等待该调用结束返回结果才能继续往下进行其他操作。异步:当前线程发起了一个调用或请求,然后当前线程不需等待调用的执行结果就可以继续往下执行(请求交由另一个线程去执行),之后可以通过被调用者的状态改变或者被调用者主动发出通知来获得执行结果
Wesley13 Wesley13
3年前
C# 线程基础
1 线程是进程中的一个执行流 2线程是一个可以单独操作的活动3线程创建和常用方法 a 创建    Thread thnewThread(Method); b常见方法 th.start()//启动线程 th.Abort()//终止线程 Thread.Sleep(n)//休眠线程(停止n毫秒后继续执
Wesley13 Wesley13
3年前
NIO
一、什么是阻塞和非阻塞?传统的IO流都是阻塞式的。也就是说,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端