Windows多线程 CreateThread()+结构体

目录

一、初衷

二、代码(C++)


一、初衷

网络上教程不够全面,要么只有CreateThread()的函数定义和简单实用方法,要么是有结构体输入但却不是多线程。

按照下面我写的代码,可以将既有结构体输入,又能执行多线程。

结构体输入的目的是:子线程函数ThreadFunction()输入有一定的讲究,而我们自己写的函数有很多参数输入,这时候可以将我们输入的参数组合起来作为结构体,再输入到ThreadFunction()函数中去。同时我们想要的输出也可以定义到结构体中。以下面代码为例,我们可以将结构体中的a作为输入,b作为输出。

二、代码(C++)

#include 
#include 

struct ThreadParameter {
	int a;
	int b;
	char user[10];
	char name[10];
};

DWORD WINAPI ThreadFunction(LPVOID pParam) {
	ThreadParameter *tp = (ThreadParameter *)pParam; //强制转换参数
	char user[10];
	char pass[10];
	strcpy(user, tp->user);
	strcpy(pass, tp->name);
	printf("User = %s pass = %s \r\n", user, pass);
	Sleep(1000);

	tp->b = tp->a + 100;
	return 0;
}

int main( )
{
	double start, end, cost;
	start = clock();	

	ThreadParameter tp1;
	strcpy(tp1.user, "qwe");
	strcpy(tp1.name, "12345");
	tp1.a = 1;
	ThreadParameter tp2;
	strcpy(tp2.user, "qwe2");
	strcpy(tp2.name, "a12345");
	tp2.a = 2;
	ThreadParameter tp3;
	strcpy(tp3.user, "qwe3");
	strcpy(tp3.name, "b12345");
	tp3.a = 3;

	HANDLE hThread[3];  
	hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp1, 0, NULL);
	hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp2, 0, NULL);
	hThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp3, 0, NULL);

	end = clock();
	cost = (end - start) / 1000;
	printf("cost: %.2fs \n", cost);

	WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
	for (int i = 0; i < 3; i++) {
		CloseHandle(hThread[i]); //关闭句柄
	}
	end = clock();
	cost = (end - start) / 1000;
	printf("cost: %.2fs \n", cost);

	printf("%d  %d  %d\n", tp1.b, tp2.b, tp3.b);
	
	system("pause");
	return 0;
}

输出结果: 

Windows多线程 CreateThread()+结构体_第1张图片

说明:线程执行顺序可能是乱序的,但我们有WaitForMultipleObjects()函数,等待所有线程结束后再退出。我们在子线程函数ThreadFunction()中有睡眠1s的操作,执行了3个线程,但最终只花了1.02s,并且输出了我们想到的结果,由此可见他们确实是并行的。

参考文档:CreateThread创建线程传递结构体参数

 CreateThread

你可能感兴趣的:(C/C++,多线程,c++,windows)