首页 > 编程语言 >[编程基础] C++多线程入门1-创建线程的三种不同方式

[编程基础] C++多线程入门1-创建线程的三种不同方式

时间:2022-12-18 23:23:48浏览次数:53  
标签:std include Thread thread C++ 线程 多线程

date: 2020-05-29 16:30:50 +0800
tags:
  - 编程基础

原始C++标准仅支持单线程编程。新的C++标准(称为C++11或C++0x)于2011年发布。在C++11中,引入了新的线程库。因此运行本文程序需要C++至少符合C++11标准。

1 创建线程的三种不同方式

在本章中,我们将讨论如何使用std::thread在C++11中创建线程。
在每个C++应用程序中,都有一个默认的主线程,即main()函数。在C++11中,我们可以通过创建std::thread类的对象来创建其他线程。每个std::thread对象都可以与一个线程关联。因此我们需要引入头文件为:

#include <thread>

那么std::thread在构造函数中接受什么?我们可以在std::thread对象上附加一个回调,该回调将在新线程启动时执行。这些回调可以是:

  1. 函数指针
  2. 函数对象
  3. Lambda函数

1.1 创建线程

可以这样创建线程对象:

std::thread thObj(<CALLBACK>);

新线程将在创建新对象后立即启动,并将与启动该线程的线程并行执行传递的回调。而且,任何线程都可以通过在该线程的对象上调用join()函数来等待另一个线程退出。
让我们看一个示例,其中主线程将创建一个单独的线程。创建此新线程后,主线程将在控制台上打印一些数据,然后等待新创建的线程退出。我们使用三种不同的回调机制来实现上述功能。

  1. 使用函数指针创建线程
#include <thread>
#include <iostream>

using namespace std;

void thread_function()
{
	for (int i = 0; i < 10000; i++);
	std::cout << "thread function Executing" << std::endl;
}

int main()
{
	// 创建线程 
	std::thread threadObj(thread_function);
	for (int i = 0; i < 10000; i++);
	std::cout << "Display From MainThread" << std::endl;
	// 等待线程的结束
	threadObj.join();
	std::cout << "Exit of Main function" << std::endl;
	return 0;
}

输出为:

Display From MainThreadthread function Executing

Exit of Main function
  1. 使用函数对象创建线程
#include <iostream>
#include <thread>

class DisplayThread
{
public:
	void operator()()
	{
		for (int i = 0; i < 10000; i++);
		std::cout << "Display Thread Executing" << std::endl;
	}
};

int main()
{
	std::thread threadObj((DisplayThread()));
	for (int i = 0; i < 10000; i++);
	std::cout << "Display From Main Thread " << std::endl;
	std::cout << "Waiting For Thread to complete" << std::endl;
	threadObj.join();
	std::cout << "Exiting from Main Thread" << std::endl;
	return 0;
}

输出为:

Display Thread ExecutingDisplay From Main Thread
Waiting For Thread to complete

Exiting from Main Thread
  1. 使用Lambda函数创建线程
#include <iostream>
#include <thread>

int main()
{
	int x = 9;
	std::thread threadObj([] {
		for (int i = 0; i < 10000; i++)
			std::cout << "Display Thread Executing" << std::endl;
	});

	for (int i = 0; i < 10000; i++)
		std::cout << "Display From Main Thread" << std::endl;

	threadObj.join();
	std::cout << "Exiting from Main Thread" << std::endl;
	return 0;
}

输出为:

Display Thread ExecutingDisplay From Main Thread

Exiting from Main Thread

1.2 区分线程

每个std::thread对象都有一个关联的ID,我们可以使用成员函数来获取,给出关联的thread对象的ID。

std::thread::get_id()

要获取当前线程使用的标识符,即

std::this_thread::get_id()

如果std::thread对象没有关联的线程,则get_id()将返回默认构造的std:

标签:std,include,Thread,thread,C++,线程,多线程
From: https://www.cnblogs.com/luohenyueji/p/16991257.html

相关文章

  • Modern C++ Overview (综览)
    PartI:Language(第一篇:语言)大局观——简直像个新语言给出一个完整实例,展示(几乎)所有新特性的样貌,让学员从真实代码中一次性窥得(几乎)全豹,得知即将面对的新知和挑战......
  • C++ Web(HTTP)开发 10 大利器
    众所周知,C++并不是一种流行的Web开发语言,究其原因有很多:语言门槛高、使用难度大、开发效率低......话虽如此,​​但随着Emscripten的成熟,未来C++在Web方面会发挥......
  • c#提供的线程安全封装类BlockingCollection与lock的区别及优点
     提供的线程安全封装类://1.引入System.Collections.Concurrent命名---线程安全数据结构//2.把之前的非线程安全的数据结构更换成以下数据结构即可;......
  • C#多线程(四)并行编程篇之结构化
    前言在前三章中我们的案例大量使用到了Thread这个类,通过其原始API,对其进行创建、启动、中断、中断、终止、取消以及异常处理,这样的写法不仅不够优雅(对接下来这篇,我称其为.......
  • C++进阶知识汇总
    知识来源:https://www.imooc.com/learn/1305二进制在计算机中的意义:计算机如何存负整数:原码:符号位变为1反码:除符号位其余取反补码:=反码+1是-7的表示方法,计算机用补码......
  • Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.)
    https://blog.kowalczyk.info/article/j/guide-to-predefined-macros-in-c-compilers-gcc-clang-msvc-etc..htmlWhenwritingportableC++codeyouneedtowritecondi......
  • C++学习---cstdio的源码学习分析08-重新打开文件流函数freopen
    cstdio中的文件访问函数stdio.h中定义了一系列文件访问函数(fopen,fclose,fflush,freopen,setbuf,setvbuf),接下来我们一起来分析一下freopen对应的源码实现。-fopen:打开文件-......
  • 多线程(概念)
    一概述是指从软件或者硬件上实现 多个线程 并发执行的技术具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。当数据量非常庞大的时候,为了提......
  • 多线程的实现 *
    一继承Thread类实现步骤:定义一个类(MyThread)继承Thread类在MyThread类中重写run()方法创建MyThread类的对象启动线程(对象名.start();)1run()和start()方法的区别(1)......
  • 线程的常用方法
    Thread类常用方法(1)thread类中设置和获取线程名称的方法voidsetName(stringName)将此线程的名称更改为等于参数NameStringgetName()返回此线程的名称Thread​(Run......