学习:生产者和消费者模式实现线程同步

线程同步 = 线程互斥 + 有序

通过事件互斥来实现:

#include<Windows.h>
#include<stdio.h>

HANDLE eve_pro;
HANDLE eve_con;

int money = 0;
DWORD WINAPI mThread_1(LPVOID pParameter) {
	while (true){
		WaitForSingleObject(eve_pro, INFINITE);
		if (money == 0) {
			money = 1;
			printf("生产者%d生产了 1 money
", GetCurrentThreadId());
			//Sleep(1000);
		}else {
			printf("--------------浪费的时间------------
");
		}


		SetEvent(eve_con);
	}
	return 0;
}

DWORD WINAPI mThread_2(LPVOID pParameter) {
	while (true) {
		WaitForSingleObject(eve_con, INFINITE);
		if (money == 1) {
			money = 0;
			printf("消费者%d消耗了 1 money
", GetCurrentThreadId());
			//Sleep(1000);
		}
		else {
			printf("--------------浪费的时间------------
");
		}

		SetEvent(eve_pro);
	}
	return 0;
}

int main() {
	eve_pro = CreateEvent(NULL, false, true, "produce");
	eve_con = CreateEvent(NULL, false, false, "consume");
	HANDLE hThreadArr[2];


	hThreadArr[0] = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		mThread_1,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);

	hThreadArr[1] = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		mThread_2,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);

	WaitForMultipleObjects(2, hThreadArr, true, INFINITE);
	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);
	CloseHandle(eve_pro);
	CloseHandle(eve_con);

	return 0;
}
原文地址:https://www.cnblogs.com/zpchcbd/p/12250016.html