C++ thread 实现多线程

都是看别人博客慢慢记下来的

进程和线程

进程

进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程
线程是进程的一个实体。

线程

进程——资源分配的最小单位,线程——程序执行的最小单位。

区别

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

根本区别:

进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

选取区别

进程与线程的选择取决以下几点:

1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。

2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应

3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;

4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;

5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

简单的使用方式

首先不多说 需要添加引用
头文件为#include< thread >,通过std::thread应用。

#include
#include
#include 

void thread1();
void thread2(int a);
using namespace std;
void main()
{
	thread Thread(thread1);
	thread Thread2(thread2,5);
	Thread.join();
	Thread2.join();

	for (int i = 0; i < 5; i++)
	{
		cout << "Main thread is working !" << endl;
		Sleep(200);
	}
	system("pause");

}

void thread1()
{
	for (int i = 0; i < 5; i++)
	{
		cout << "正在执行线程一" << endl;
		Sleep(200);
	}
}

void thread2(int a)
{
	for (int i = 0; i < 5; i++)
	{
		cout << "正在执行线程二\n输入参数为:" << a << endl;
		Sleep(200);
	}
}

C++ thread 实现多线程_第1张图片
两个子线程并行执行,join函数会阻塞主流程,所以子线程都执行完成之后才继续执行主线程。可以使用detach将子线程从主流程中分离,独立运行,不会阻塞主线程:detach()是的子线程放飞自我,独立于主线程并发执行,主线程后续代码段无需等待

其中顺便碰到输出中文和字符变成问号 右键控制台设置成旧版本就好了

Thread.detach();
Thread2.detach();

执行结果
C++ thread 实现多线程_第2张图片

通过线程调用类方法

Dowork类下方法numadd

class Dowork
{
public:
	void numadd(int a, int b)
	{
		int c;
		c = a + b;
		cout << c << endl;
	}
	Dowork();
	~Dowork();
    private:  
};

使用

thread Thread7(&Dowork::numadd,&work,6,5);
//第一个参数显示类型  第二个表示类 后面两个是参数
Thread7.join();

给出的方法

C++ thread 实现多线程_第3张图片
1 detach
脱离当前主线程,自由执行,乱序;

Thread.detach();

2 std::this_thread::get_id()
获取当前线程编号

cout << Thread2.get_id() << endl; 

3 std::thread::hardware_concurrency()
检测CPU有多少个核心

auto n = std::thread::hardware_concurrency();//检测CPU有多少个核心

4 join()
等待模式,执行完再执行下一个

Thread.join();

5 joinable()
返回是否正在执行 返回为bool类型

bool joinable() const _NOEXCEPT

6 native_handle()
返回句柄? 需要再看

    auto tn=t.native_handle();
	t.join();
	cout<<"tn="<

7 swap()
交换两个线程的ID和句柄

Thread2.swap(Thread1);

你可能感兴趣的:(C/C++复习回顾)