代码编织梦想

1:std::thread的基本用法

最简单的 std::thread用法如下,调用 thread将立即同时开始执行这个新建立的线程,新线程的任务执行完毕之后, main()的主线程也会继续执行。

#include<iostream>
#include<thread>
#include<windows.h>
#include<string>
using namespace std;

void myfunc_work() {
	cout << "myfunc_work ....." << endl;
	// do something 5s 
	Sleep(5000);
}

int main() {
	std::thread t1(myfunc_work);
	// 阻塞当前main主线程,待子线程执行完毕后,自己恢复主线程逻辑
	t1.join();
	cout << "main thread ....." << endl;

}

2:std:: thread常用的成员函数 

下面为C++  std::thread常用的成员函数

get_id()    取得目前的线程 id, 回传一个 std::thread::id  类型

joinable()    检查是否可 join

join()   // 阻塞当前线程,等待子线程执行完毕

detach()  // 与该线程分离,一旦该线程执行完后它所分配的资源就会被释放

native_handle()    取得平台原生的 native handle.

sleep_for()    // 停止目前线程一段指定的时间

yield()   // 暂时放弃CPU一段时间,让给其他线程

void foo() {
	cout << "foo\n";
}

void bar(int x) {
	cout << "bar\n";
}

int main() {
	//std::thread t1(myfunc_work);
	//cout << "main thread ....." << endl;
	 阻塞当前main主线程,待子线程执行完毕后,自己恢复主线程逻辑
	//t1.join();
	
	thread t1(foo);
	thread t2(bar, 10);
	cout << "main,foo,bar execute concurrently....\n";

	cout << "sleep 1s\n";
	this_thread::sleep_for(chrono::seconds(2));

	cout << "join t1\n";
	t1.join();
	cout << "join t2\n";
	t2.join();

	cout << "foo and bar thread complete";

}

很显然:新线程建立后,是否立即执行新线程业务代码,有一定的随机性。

但是我们可以通过 thread.join()  或者 sleep_for() 来控制代码执行顺序 

3:建立新 thread执行类别中的函数 

C++ std::thread 的构建可以传入class类别中的成员函数,如下范例所示:AA::start 分别建立t1, t2 两个线程,而 t1传入 AA::a1 类别函数。

notice : 

     第一个参数:AA::a1 前面需要添加 & 

     第二个参数:代表的是那个类对象

     后面参数: 按照要求传入即可

class AA
{
public:
	void a1()
	{
		cout << "a1\n";
	}

	void a2(int n) {
		cout << "a2 : " << n << "\n";
	}

	void start() {
		thread t1(&AA::a1, this);
		thread t2(&AA::a2, this,10);

		t1.join();
		t2.join();
	}

private:

};

4:建立新 thread 执行 lambda expression 

std:: thread 的构建也可以传入 lambda expression 表达式,如下范例:

5:join等待thread执行结束

在main主线程建立 t1线程后,主线程便继续往下执行,如果主线程需要等待 t1执行完毕后才能继续执行的话,就需要使用 join 。

等待 t1线程执行完 foo 后主线程才能继续执行,如果 t1线程没有执行完,主线程会一致阻塞在 join这一行。

void test2() {
	cout << "foo begin...." << endl;
	this_thread::sleep_for(chrono::milliseconds(5000));
	cout << "foo end...." << endl;
}


int main() {
	std::thread t1(test2);
	cout << "main 1....." << endl;;
	t1.join();
	cout << "main 2.....";


	cout << "main thread run over" << endl;
}

6:detach不等待 thread执行结束 

承上例:如果主线程不想等或者可以不用等待 t1线程,可以使用 detach来让 t1线程分离,接着主线程就可以继续执行,t1线程 也在继续执行。

/**
	join等待thread执行结束
*/
void test2() {
	cout << "foo begin...." << endl;
	this_thread::sleep_for(chrono::milliseconds(50));
	cout << "foo end...." << endl;
}

int main() {
	
	std::thread t1(test2);
	cout << "main 1....." << endl;;
	t1.detach();
	cout << "main 2....."<< endl;


	cout << "main thread run over" << endl;
	Sleep(2000);
	return 0;
}

7:std::thread 参数传递使用引用的方法

定义方法:

void  myFunc(int&  n) {

        std::cout << "myFunc  n = " << n << endl;

        n+= 10;

}

使用参数传递使用引用目的是: 希望建立另外一个线程去执行 myFunc , 之后需要取得这个 myFunc的运算结果,但是建立线程如果写: std::thread t1(myFunc , n)  这样会编译出错。

因为在 std::thread 的参数传递方式为值传递,值传递是不可修改的左值,如果要让其能修改,可以考虑通过 : std::ref 来达成。

void myFunc(int n) {
	std::cout << "myFunc n = " << n << endl;
	n += 10;
}

void myFunc_ref(int& n) {
	std::cout << "myFunc reference n = " << n << endl;
	n += 10;
}

int main() {

	int n1 = 5;
	thread t1(myFunc, n1);
	t1.join();
	cout << "main n1 = " << n1 << "\n";

	int n2 = 10;
	thread t2(myFunc_ref, std::ref(n2));
	t2.join();
	cout << "main n2 = " << n2 << "\n";

	cout << "main thread run over" << endl;
	return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013620306/article/details/128565614

c++11新特性:std::thread多线程-爱代码爱编程

       在C++11以前,C++的多线程编程在不同到平台使用不同的API,比如linux平台使用pthread,windows平台使用winSDK中的Create,或者依赖其他第三方接口实现,一定程度上影响了代码的移植性。C++11中,引入了boost库中的多线程部分内容,形成C++标准,形成标准后的boost多线程编程部分接口基本没有变化,这样方便

c++:多线程std::thread-爱代码爱编程

C++:多线程std::thread 1. 线程的创建和终止2. 线程的参数传递3.线程和进程的身份标识 1. 线程的创建和终止   在main函数中,创建线程并控制线程结束: #include <i

C++11 std::thread std::bind 启动多线程-爱代码爱编程

#include <iostream> #include <thread> class Task { public: void executeThread(std::string command) { for(int i = 0; i < 5; i++) {

C++11 std::thread线程库-爱代码爱编程

翻译原文:https://thispointer.com/c11-tutorial/ C++11 线程库介绍 C++11 中新增了多线程 std::thread,相比之前使用较多的是操作系统提供的 POSIX 线程接口,新标准引入了线程库无疑带来了许多便利。 要使用 C++11 多线程,首先 gcc 编译器版本需要大于4.8,并且编译时,需要加上参数

C++-std::thread之向线程函数传递参数-爱代码爱编程

文章目录 向线程函数传递参数 向线程函数传递参数 向线程函数传递参数只需要向std::thread构造函数传递额外的参数即可 std::thread t(hello,arg1,arg2); 需要注意的是,参数会被拷贝到单独的存储空间中,然后作为右值传递给可调用对象。 void f(int i,std::string const&

C++:std::thread-爱代码爱编程

1.std::thread的用法 头文件为: #include <thread> 2.例子 #include <thread> #include <iostream> #include <unistd.h> using namespace std; void thread_fun1(int va

C++ 多线程(一):std::thread用法-爱代码爱编程

一、作用: 构造thread对象时,传入一个可调用对象作为参数(如果可调用对象有参数,把参数同时传入)。这样构造完成后,新的线程马上被创建,同时执行该可调用对象。 二、用法:2.1、std::thread::join A线程调用B线程对象的join函数后,阻止A线程的执行,直到B线程对应可调用对象的所有操作执行完成。 2.2、std::thread::

C++多线程:std::thread-爱代码爱编程

最近这段时间在学习C++多线程相关的知识,打算将学习的内容记录下来,加深理解和记忆。 C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>

c++多线程--std::thread_qls315的博客-爱代码爱编程

0 引言 在C++多线程专栏中,我讲解了std::async,std::future,std::promise以及内存序相关概念,基本上涵盖了C++事件处理相关的基本构建块。 为了保证对C++多线程中相关线程概念的全部介绍,后期会增加相应的std::thread, std::mutex, std::lock_guard, std::unique_loc

c++11多线程std::thread入门使用以及对比分析pthread_欧特克_glodon的博客-爱代码爱编程

前言   多数线程池样例一直都是用pthread的API写C++的多线程程序。但从C++11开始,标准库里已经包含了对线程的支持,因此将pthread与std::thread的用法做一个详细对比。 一、 Thread

c++ 多线程编程(一):std::thread的使用_n阶魔方的博客-爱代码爱编程

多线程编程简介 说到多线程编程,就不得不提并行和并发,多线程是实现并发和并行的一种手段。 并行是指两个或多个独立的操作同时进行。 并发是指一个时间段内执行多个操作。 在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了

c++的std::thread和std::move_c++线程池使用std::move-爱代码爱编程

最近经常使用thread类,如果需要在线程创建后,对其灵活控制,有两种方法: 1、定义成全局变量 2、定义成类成员变量 记录一下学习过程。 一、工程创建 用VS2022创建一个CMake工程ThreadTest,在ThreadTest.cpp中填入一段代码 // ThreadTest.cpp: 定义应用程序的入口点。 #include "

c++——std::async和std::thread-爱代码爱编程

作者:小 琛 欢迎转载,请标明出处 参考文章: 傻月菇凉博主-博客 OceanStar的学习笔记博主-博客 NGC_2070博主-博客 文章目录 std::threadthread的提出使用方法、语法