多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,分为两种类型的多任务处理:基于进程和基于线程。
1)基于进程的多任务处理是程序的并发执行。
2)基于线程的多任务处理是同一程序的片段的并发执行。
多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径。在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。比如说,同一个文件,可能一个线程会对其进行写操作,而另一个线程需要对这个文件进行读操作,可想而知,如果写线程还没有写结束,而此时读线程开始了,或者读线程还没有读结束而写线程开始了,那么最终的结果显然会是混乱的。为了保护共享资源,在线程里也有这么一把锁——互斥锁(mutex),互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。
在Windows下用C++创建线程需要导入windows.h头文件,同时调用CreateThread()函数。如下:
#include <windows.h> HANDLE thread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
参数说明:
1)In_opt LPSECURITY_ATTRIBUTES:lpThreadAttributes, {安全设置}
指向 TSecurityAttributes 结构的指针,一般都是置为NULL,这表示没有访问限制。
2)In SIZE_T:dwStackSize, {堆栈大小}
分配给线程的堆栈大小,每个线程都有自己独立的堆栈(也拥有自己的消息队列)。它们都是进程中的内存区域,主要是存取方式不同(栈:先进后出;堆:先进先出)。
3)In LPTHREAD_START_ROUTINE:lpStartAddress, {入口函数}
线程入口函数的参数是个无类型指针,用它可以指定任何数据。
4)In_opt __drv_aliasesMem LPVOID:lpParameter, {函数参数}
函数指针,新线程建立后将立即执行该函数,函数执行完毕,系统将销毁此线程从而结束多线程的程序。
5)In DWORD:dwCreationFlags, {启动选项}
启动选项)有两个可选值:0(线程建立后立即执行入口函数);CREATE_SUSPENDED(线程建立后会挂起等待)。
6)Out_opt LPDWORD:lpThreadId {输出线程id}
输出线程句柄ID,注意: 1、线程的 ID 是唯一的;而句柄可能不只一个,比如可以用 GetCurrentThread 获取一个伪句柄、可以用 DuplicateHandle 复制一个句柄等。2、ID 比句柄更轻便,在主线程中 GetCurrentThreadId、MainThreadID获取的都是主线程的 ID。
返回值:线程句柄 ,"句柄" 类似指针,但通过指针可读写对象,通过句柄只是使用对象;有句柄的对象一般都是系统级别的对象(或叫内核对象)。
原文:https://www.cnblogs.com/JCpeng/p/15008496.html