std::thread的join()和detach()

std::thread:代表单独的线程对象。同一进程中的线程共享同一个地址空间。一个初始化的thread对象代表一个激活的线程,该对象是joinable的,有唯一的线程id。一个只构造但没有初始化的线程对象是non-joinable的线程,所有non-joinable的线程的id都是一样的。对joinable的线程执行join()或者detach()操作后,该线程就变成non-joinable的了。

构造函数:

default (1)	thread() noexcept;

initialization (2)	template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);

copy [deleted] (3)	thread (const thread&) = delete;不支持拷贝构造函数

move (4)	thread (thread&& x) noexcept;

join(): 当线程执行完成时,函数返回调用线程(与调用线程join汇合)。这将使函数返回的时刻与线程中所有操作的完成保持同步:这将阻塞调用该函数的线程的执行,直到在构造时被调用的函数返回(如果还没有返回)。调用过该函数后,thread对象就变成non-joinable的了,可以被安全地销毁。
可以发现“1 threads joined!”输出之前三个线程都有输出,线程1执行完之后,该消息就会被打印。

#include <iostream>
#include <thread>


void pause_thread(int n){
	for(int i=0; i<n; i++){
		std::cout << "thread id: " << std::this_thread::get_id() << " i: " << i <<"\n";
	}
}

int main(){
	std::thread th1(pause_thread, 1000);
	std::thread th2(pause_thread, 2000);
	std::thread th3(pause_thread, 3000);
	std::cout << "Done spawning threads. Now waiting for them to join.\n";
	th1.join();
	std::cout << "1 threads joined!\n";
	th2.join();
	std::cout << "2 threads joined!\n";
	th3.join();
	std::cout << "All threads joined!\n";
	return 0;
}

detach(): 将对象表示的线程与调用线程分离,允许它们彼此独立执行。两个线程在没有阻塞或同步的情况下继续运行。 注意,当任何一个结束执行时(调用线程或者当前对象代表的线程),它的资源都会被释放。

#include <iostream>
#include <thread>
#include <chrono>

void pause_thread(int n){
	for(int i=0; i<n; i++){
		std::cout << "thread id: " << std::this_thread::get_id() << " i: " << i <<"\n";
	}
}

int main(){
	std::thread th1(pause_thread, 1000);
	std::thread th2(pause_thread, 2000);
	std::thread th3(pause_thread, 3000);
	std::cout << "Done spawning threads. Now waiting for them to detach.\n";
	th1.detach();
	std::cout << "1 threads detached!\n";
	th2.detach();
	std::cout << "2 threads detached!\n";
	th3.detach();
	std::cout << "All threads detached!\n";
//调用线程sleep 5s,让子线程有时间执行完毕,否则当主线程退出时,子线程的资源就会被释放掉。
	std::this_thread::sleep_for(std::chrono::seconds(5));
	std::cout << "sleep 5s\n";
	return 0;
}

参考https://www.cplusplus.com/reference/thread/thread/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值