C++多线程的一些理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cuixing001/article/details/82856681

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

猜你喜欢

转载自blog.csdn.net/cuixing001/article/details/82856681