1. 程式人生 > >C++多執行緒的一些理解

C++多執行緒的一些理解

C++多執行緒程式設計有多種方法,傳統方法稍微繁瑣,不易理解,現給出一demo示例,說明執行同一任務達到並行執行的效果,從而提高程式效率。

#include <iostream>
#include <Windows.h>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
HANDLE hObject;

// 傳遞執行緒引數的結構體
typedef struct threadParams
{
	int a;
	int  b;
}threadParams;


DWORD WINAPI Fun(LPVOID lps)//建立多執行緒函式,函式返回值為DWORD WINAPI,一定要是這個,否則會出錯
{
	threadParams *mydata = (threadParams*)lps;
	while (true)
	{
		Sleep(2000);
		WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,知道獲取"screen"資源後,才返回
		cout << mydata->a << "," << mydata->b << endl;
		//cout << "支執行緒1" << endl;
		SetEvent(hObject);
	}
}

DWORD WINAPI Fun1(LPVOID lps)
{
	threadParams *mydata = (threadParams*)lps;

	while (true)
	{
		WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,直到有訊號後,才執行下面語句
		//cout << "支執行緒1" << endl;
		cout << mydata->a << "," << mydata->b << endl;
		//Sleep(2000);
		SetEvent(hObject);
	}
}

DWORD WINAPI Fun2(LPVOID lps)
{
	threadParams *mydata = (threadParams*)lps;

	while (true)
	{
		WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,直到有訊號後,才執行下面語句
		//cout << "支執行緒1" << endl;
		cout << mydata->a << "," << mydata->b << endl;
		//Sleep(2000);
		SetEvent(hObject);
	}
}


int main()
{
	threadParams parms[3] = {1,2,3,4,5,6};

	HANDLE handle1 = CreateThread(NULL, 0, Fun, &parms[0], 0, NULL);//建立多執行緒
	HANDLE handle2 = CreateThread(NULL, 0, Fun, &parms[1], 0, NULL);//建立多執行緒
	HANDLE handle3 = CreateThread(NULL, 0, Fun, &parms[2], 0, NULL);//建立多執行緒
	HANDLE handales[3] = { handle1,handle2,handle3 };

	hObject = CreateEvent(NULL, false, false, NULL);
	SetEvent(hObject);
	CloseHandle(handle1);//釋放執行緒
	CloseHandle(handle2);//釋放執行緒
	CloseHandle(handle3);//釋放執行緒
	while (true)
	{
		double time1 = getTickCount();
		WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,知道獲取"screen"資源後,才返回
		Sleep(500);
		cout << "主執行緒1" << endl;
		printf("take time(ms)%.2f\n", (getTickCount() - time1) / getTickFrequency() * 1000);
		SetEvent(hObject);
	}
	CloseHandle(hObject);
	return 0;
}

可以看出,三個“任務”是同時隔2000ms同步一次。

Reference

https ://blog.csdn.net/naibozhuan3744/article/details/78746292?utm_source=copy