简单的多线程编程

相关API函数介绍:


函数:HANDLE OpenThread( DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId)
作用:利用线程ID获得线程句柄
dwDesiredAcess:打开进程欲获得大的权限,一般PROCESS_ALL_ACCESS 
bInheritHandle:获得的句柄是否可以继承,一般不:FALSE
dwThreadId:线程的ID

函数:DWORD SuspendThread(HANDLE)

作用:暂停线程
参数是要暂停线程的句柄

函数:DWORD ResumeThread(HANDLE)
作用:恢复线程
参数是要暂停线程的句柄


函数:HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize, 
  LPTHREAD_START_ROUTINE lpStartAddress,     LPVOID lpParameter,
  DWORD dwCreationFlags, 
  LPDWORD lpThreadId
);

作用:创建线程(创建不成功返回NULL)

lpThreadAttributes:创建线程的安全属性,一般为NULL(默认)
dwStackSize:指定线程使用缺省的堆栈大小,如果为NULL,则与进程主线程相同
lpStartAddress:指定线程函数,线程从该函数的入口处开始运行,函数返回意味着线程的结束
函数的定义形式如下:
DWORD WINAPI ThreadProc( LPVOID lpParameter);该参数在CreateThread中给出,函数名称随便
lpParameter:表示传给线程函数的一个任意类型的指针,可以是多个参数通过结构体一次性传入
dwCreationFlags:创建线程后线程的状态,如果是0,则立即执行;如果是CREATE_SUSPENDED,则线程处于暂停状态,等需要执行的时候使用ResumeThread函数恢复执行
lpThreadId:返回线程的ID(指针)


函数:DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
)
作用:主线程的等待函数(只能等待一个线程)

hHandle:要等待对象的线程句柄
dwMilliseconds:指定等待超时的毫秒数,立即返回为0;无限等待为INFINITE
函数失败,返回WAIT_FAILEDD;等待对象编程激发态,返回WAIT_OBJECT_0;如果等待对象编程激发态之前,等待时间结束了,则返回WAIT_TIMEOUT


函数:DWORD WaitForMultipleObjects(
  DWORD nCount,
  CONST HANDLE *lpHandles,
  BOOL fWaitAll,
  DWORD dwMilliseconds
)


作用:可以等待多个线程

nCount:让函数等待的线程个数,范围在1--MAXIMUM_WAIT_OBJECTS之间
lpHandles:指向等待线程句柄的数组指针
fWaitALl:TRUE:等待全部线程结束
dwMilliseconds:用法同WaitForSingleObject中

其中暂停和等待函数就不必介绍使用,很简单。下边是一个简单例子,解释在其中:

# include <iostream>
# include <Windows.h>
# include <tchar.h>
# include <vector>
using namespace std;
DWORD ThreadProc_1()               //线程函数_1
{
	cout << "It's Thread_1 now." << endl;
	return 0;      
}
DWORD ThreadProc_2()              //线程函数_2
{
	cout << "It's Thread_2 now." << endl;
	return 0;
}
int main()
{
	vector<HANDLE>HANDLES;       //句柄数组

	DWORD ThreadId_1 = 0;       //定义线程_1的ID

	//创建线程1
	HANDLE hThread_1 = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadProc_1,NULL,0,&ThreadId_1);

	DWORD ThreadId_2 = 0;      //定义线程_2的ID

	//创建线程2
	HANDLE hThread_2 = CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)ThreadProc_2,NULL,0,&ThreadId_2);

	//判断句柄是否有效
	if (hThread_1 == INVALID_HANDLE_VALUE||hThread_1==INVALID_HANDLE_VALUE)
	{
		cout << "Create Thread Failed!" << endl;
	}

	//添加句柄到数组
	HANDLES.push_back(hThread_1);
	HANDLES.push_back(hThread_2);

	//WaitforSingleObject这是等待一个线程,主线程的执行需要等待其他线程的完成,第一个参数是句柄

	//DWORD Info=WaitForSingleObject(hThread_1, INFINITE);

	//WaitForMultipleObjects等待多个线程

	DWORD Info = WaitForMultipleObjects(2,&HANDLES[0],TRUE,INFINITE);

	//如果等待失败
	if (Info == WAIT_FAILED)
	{
		cout << "Wait Failed!" << endl;
	}
	cout << "Main function now." << endl;
	system("pause");
	return 0;
}

结果如下:

发布了37 篇原创文章 · 获赞 12 · 访问量 9263

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/99114409