HANDLE
WINAPI
CreateThread(
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
    _In_ SIZE_T dwStackSize,
    _In_ LPTHREAD_START_ROUTINE lpStartAddress,
    _In_opt_ __drv_aliasesMem LPVOID lpParameter,
    _In_ DWORD dwCreationFlags,
    _Out_opt_ LPDWORD lpThreadId
    );

函数的作用是创建一个新线程,函数参数说明如下:

  • HANDLE-函数返回值,表示创建函数线程的句柄,此类型在windows库中被定义为void*  就是一个void型的指针,此指针可以作为挂起,恢复挂起等线程相关操作的输入参数
  • lpThreadAttributes-设置SECURITY_ATTRIBUTES(安全属性),如设置为NULL,则使用默认安全性
  • dwStackSize-设置线程的栈大小,用来保存上下文切换和线程的局部变量,如果设置的太小(不够线程使用)则会创建线程失败,一般默认为0,此时会和主线程的栈大小一样,VS中的默认大小是1M,另外就是设置此参数会四舍五入到一个最近的可使用(64KB的倍数)的栈大小数字中
  • lpStartAddress-新建线程的执行函数入口地址,即函数名
  • lpParameter-向线程函数中传入的参数
  • dwCreationFlags-创建线程的标志:
    0线程创建完成就立即开始执行
    CREATE_SUSPENDED线程创建完处于挂起(suspended)状态,需要ResumeThread函数唤醒
      
  • lpThreadId-新建线程的ID

函数中其他标志说明:

  • _In_:输入参数
  • _Out_:输出参数,一般输入的是地址或者引用
  • *_opt_:可选参数,一般由此标志的则表示此参数可为NULL
  • WINAPI:__stdcall函数调用协议
  • DWORD-unsigned long
  • LPDWORD-DWORD* -unsigned long*
  • LPVOID-void*
  • LPTHREAD_START_ROUTINE - 函数的入口地址(函数名),windows API中定义如下:
    typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);

    所以定义线程执行函数时要遵守此规则,返回值为DWORD(unsigned long)类型,调用协议为WINAPI,输入参数是LPVOID(void*)类型,另外输入的类型和CreateThread函数中的第四个参数(lpParameter)的类型相同都是void*,所以可进行参数传递,传递以后如要在自己的编写中的线程执行函数中使用需要强制转换成数据原有的数据类型


DWORD WINAPI SuspendThread(
  _In_ HANDLE hThread
);

挂起线程操作,挂起就是当前不再执行此线程,输入参数是上面创建线程返回的句柄,若返回为-1,则挂起失败


DWORD WINAPI ResumeThread(
  _In_ HANDLE hThread
);

从挂起状态恢复,参数的说明和挂起函数相同


BOOL WINAPI CloseHandle(
  _In_ HANDLE hObject
);

关闭线程句柄,只是关闭句柄,并不是停止线程,关闭以后句柄就不能再使用了,但是线程还在执行


VOID WINAPI Sleep(
  _In_ DWORD dwMilliseconds
);

线程休眠,输入参数的单位是ms


DWORD WINAPI GetCurrentThreadId(void);

获取当前线程的ID


使用例程如下:

// windowsAPI创建线程.cpp : 定义控制台应用程序的入口点。
//
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;

DWORD WINAPI threadfunc(LPVOID lpThreadParameter)
{
	while (true)
	{
		cout << "输入参数:";
		cout << static_cast<char*>(lpThreadParameter) << endl;
		cout << "子线程ID" << GetCurrentThreadId() << endl;
		Sleep(1000);
	}
	return 0;
}

int main()
{
	DWORD threadID=0;
	HANDLE tHandle=CreateThread(NULL,0, threadfunc,"Hello",0,&threadID);
	if (tHandle == NULL)
	{
		cout << "创建线程失败" << GetLastError() << endl;
	}
	cout << "子线程ID:"<< threadID << endl;
	cout << "线程句柄"<<tHandle << endl;
	cout << "主线程ID" << GetCurrentThreadId() << endl;
	getchar();
	cout<<"挂起线程"<<SuspendThread(tHandle);
	getchar();
	cout<<"恢复挂起"<<ResumeThread(tHandle);
	getchar();
	return 0;
}

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐