c++的多线程详解| 8月更文挑战

711 阅读3分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

hello大家好,我是专写有趣小玩意的老诗。

在之前我就编写过一篇关于python多线程的文章,大家有兴趣的可以去看看【传送门

认识多线程

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理。

动手编写多线程

创建线程

用 CreateThread()创建一个线程。 //返回值:一个HANDLE类型的值,表示线程的句柄,可用于等待线程等函数

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes, // 一般设置为NULL
  SIZE_T                  dwStackSize,        // 堆栈大小,不重要,一般设置为0,表示使用默认堆栈大小
  LPTHREAD_START_ROUTINE  lpStartAddress,     // 函数指针,传入函数名或指针即可
  __drv_aliasesMem LPVOID lpParameter,        // 参数指针,供函数使用
  DWORD                   dwCreationFlags,    // 一般设置为0
  LPDWORD                 lpThreadId          // 指针,用于保存线程的id,一般设置为NULL
);]

使用方法

// 声明线程函数的模板:
DWORD WINAPI threadname(LPVOID lpParamter) // 函数名字可随意
{
	/*
	这里填入你的代码
	*/
	return 0L;
}

// 根据声明的函数创造一个线程
// 若函数没有参数,传入函数名字即可,其它参数参考下方示例
 HANDLE hThread = CreateThread(NULL, 0, threadname, NULL, 0, NULL);

实例

#include<iostream>
#include<windows.h>

using namespace std;

// 编写了一个我的线程函数
DWORD WINAPI MyThread1(LPVOID lpParamter)
{
        while(1)
        {
            cout << "MyThread1\n";
        }
	return 0L;
}

DWORD WINAPI MyThread2(LPVOID lpParamter)
{
	 while(1)
        {
            cout << "MyThread2\n";
        }
	return 0L;
}

int main ()
{
	// 创造线程
	CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);
        CreateThread(NULL, 0, MyThread2, NULL, 0, NULL);
	return 0;
}

上面的实例会出现的效果是1和2间隔出现。我们创建了线程1函数MyThread1和线程2函数MyThread2。但是这里要注意的是他们1和2出现是无规律的间隔。因为他们不会等待,只会自己执行自己的东西。所以他们的输出是无规律的,也是不可猜测的。他们运行的结果每一次都有可能不一样。

多线程应用场景

什么时候需要用到多线程呢?当我们不想因为阻塞而停下程序运行的时候,我们就可以用到多线程。python中的多线程多用于爬虫,为了增加爬虫程序的性能,更快的爬取内容。而c++的多线程可以应用在游戏程序上面。你想一下,要是一个玩家的游戏操作可以卡顿其他玩家,这个是多么糟糕的结果。所以一般c++用做服务器后端,都会用上多线程这一种技术的。

想要更深入了解多线程,得到更多源码案例的话。请移步到公众号:诗一样的代码

既然进来了,原创不易。小伙伴点个赞再走呗