线程同步 = 线程互斥 + 有序
通过事件互斥来实现:
#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;
}