❥关于C++之多线程┆<thread>join()detach()

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于C++之多线程┆<thread>join()detach()相关的知识,希望对你有一定的参考价值。

std::thread (C++11)
class thread;

描述:thread类来表示执行的各个线程。

执行线程是一个指令序列,可以在多线程环境中与其他此类序列并行执行,同时共享相同的地址空间。
初始化的thread对象表示活动的执行线程;这样的线程对象是可接合的,并且具有唯一的thread id。
默认构造(未初始化)的thread对象不可接合的,其thread id对于所有不可接合的线程都是公共通用的。
➌如果从中移动,或者调用了接合(join)分离(detach),则可接合线程将变得不可接合

构造函数:构造一个thread对象。

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;
——————————————————————————————————————————————————————————————
(1) 默认构造函数
构造一个不代表任何执行线程的线程对象。
(2) 初始化构造函数
构造一个线程对象,该对象表示一个新的可接合执行线程。
新的执行线程调用fn,将参数作为参数传递(使用其左值或右值引用的衰减副本)。
这个构造的完成与fn副本调用的开始同步。
(3) 复制构造函数
已删除构造函数表单(无法复制线程对象)。
(4) 移动构造函数
构造一个线程对象,该对象获取由x(如果有的话)表示的执行线程。
此操作不会以任何方式影响移动线程的执行,它只是传输其处理程序。
x对象不再代表任何执行线程。
————————————————————————————————————————————————————————————————
参数:
fn
指向函数的指针、指向成员的指针或任何类型的可移动可构造函数对象(即,其类定义运算符()的对象,包括闭包和函数对象)。
返回值(如果有)将被忽略。
——————————————————————
args...
传递给fn调用的参数(如果有)。其类型应为可移动式。
如果fn是成员指针,则第一个参数应为定义该成员的对象(或引用,或指向该成员的指针)。
——————————————————————
x
thread对象,其状态被移动到构造的对象。

Fn和Arg...是模板参数:如果隐式推断,则这些是将参数绑定到的适当的左值或右值引用类型。但是请注意,在新线程中调用fn时,fn和args...的衰变副本始终使用。

>>> 可接合的thread对象,在它被销毁之前,应该是joined或detached。

thread创建后,需要在调用线程中需要指明是join还是detach,否则会发生错误。<<< 

join()与detach():

void join(); 接合线程。

当线程执行完成时,函数返回。
这将使该函数返回的时刻与线程中所有操作的完成同步:这将阻止调用该函数的线程的执行,直到构造时调用的函数返回(如果尚未返回)。
调用此函数后,线程对象将变得不可接合,并且可以安全地销毁。

void detach(); 分离线程。

将对象表示的线程与调用线程分离,允许它们彼此独立执行。
这两个线程都会继续,不会以任何方式阻塞或同步。请注意,当其中一个结束执行时,其资源将被释放。
调用此函数后,线程对象将变得不可接合,并且可以安全地销毁。

示例——join():

#include <iostream>
#include <thread>
using namespace std;
void func(int n) 
	for (int i = 0; i < n; i++) 
		cout << "子线程 func():" << i << endl;
	

int main()  // 主线程
	cout << "mian() start" << endl;
	thread t(func, 5);// 子线程
	t.join();// 等待子线程结束后才进入主线程
	cout << "mian() end" << endl;
	return 0;
mian() start
子线程 func():0
子线程 func():1
子线程 func():2
子线程 func():3
子线程 func():4
mian() end

示例——detach(): 

#include <iostream>
#include <thread>
using namespace std;
void func(int n) 
	for (int i = 0; i < n; i++) 
		cout << "子线程 func():" << i << endl;
	

int main()  // 主线程
	cout << "mian() start" << endl;
	thread t(func, 5);// 子线程
	t.detach();// 子线程与主线程彼此独立执行
    for (int i = 0; i < 20; i++)
    	cout << "mian() end" << endl;
	return 0;
mian() start
mian() end
mian() end
mian() end
mian() end子线程 func():
mian() end
mian() end
mian() end
mian() end
mian() end
mian() end
0mian() end
mian() end

mian() end
子线程 func():mian() end1

mian() end子线程 func():
mian() end2

子线程 func():mian() end3

子线程 func():mian() end4

mian() end
mian() end

示例——thread::get_id&this_thread::get_id

#include <iostream>// std::cout
#include <thread>// std::thread, std::thread::id, std::this_thread::get_id
std::thread::id main_thread_id = std::this_thread::get_id();
void checkThreadType() 
	if (main_thread_id == std::this_thread::get_id())
		std::cout << "This is the main thread.\\n";
	else
		std::cout << "This is not the main thread.\\n";

int main() 
	checkThreadType();// 主线程中执行函数
	std::thread th(checkThreadType);// 子线程中执行函数
	th.join();// block main thread直到构造函数调用的函数运行结束
	return 0;
This is not the main thread.
This is the main thread.

 示例——joinable():

// example for thread::joinable
#include <iostream>// std::cout
#include <thread>// std::thread
void mythread() 
	// do stuff...

int main() 
	std::thread foo;
	std::thread bar(mythread);
	std::cout << "Joinable after construction:\\n" << std::boolalpha;
	std::cout << "foo: " << foo.joinable() << '\\n';
	std::cout << "bar: " << bar.joinable() << '\\n';
	if (foo.joinable()) foo.join();
	if (bar.joinable()) bar.join();
	std::cout << "Joinable after joining:\\n" << std::boolalpha;
	std::cout << "foo: " << foo.joinable() << '\\n';
	std::cout << "bar: " << bar.joinable() << '\\n';
	return 0;
Joinable after construction:
foo: false
bar: true
Joinable after joining:
foo: false
bar: false

以上是关于❥关于C++之多线程┆<thread>join()detach()的主要内容,如果未能解决你的问题,请参考以下文章

Python之多线程

Java复习 之多线程

python并发之多线程

Python并发编程系列之多线程

语法之多线程

Python之多线程:Threading模块