//多线程同步
//互斥对象的应用
#define WIN32_LEAN_AND_MEAN
#include <STDIO.H>
#include <stdlib.h>
#include <WINDOWS.H>
HANDLE hThread1,hThread2;//线程句柄1,线程句柄2
DWORD ExitCode1,ExitCode2;//线程1退出码,线程2退出码
DWORD ThreadId1,ThreadId2;//线程1的ID,线程2的ID
//① 定义互斥对象句柄
HANDLE Mutex1,Mutex2;//互斥对象1,互斥对象2
int parameter1=0,parameter2=0;//参数1,参数2
DWORD WINAPI ThreadFunc(LPVOID);//线程函数
int main()
{
//②创建互斥对象
Mutex1 = CreateMutex(
NULL, //默认安全属性
FALSE, //创建线程不拥有这个互斥对象
"SynMutex1" //线程名
);
Mutex2 = CreateMutex(NULL,FALSE,"SynMutex2");
hThread1 = CreateThread(NULL,0,ThreadFunc,(LPVOID)1,NULL,&ThreadId1);
hThread2 = CreateThread(NULL,0,ThreadFunc,(LPVOID)2,NULL,&ThreadId2);
Sleep(2000);//等待线程执行完毕
GetExitCodeThread(hThread1,&ExitCode1);
GetExitCodeThread(hThread2,&ExitCode2);
printf("线程1退出码:%ld=====线程2退出码:%ld\n",ExitCode1,ExitCode2);
printf("线程1的ID :%ld=====线程2的ID :%ld\n",ThreadId1,ThreadId2);
ReleaseMutex(Mutex1);
ReleaseMutex(Mutex2);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(Mutex1);
CloseHandle(Mutex2);
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
//说明
//重新设定一个HANDLE数组
//数组赋值应为要获得与互斥数据绑定的互斥句柄
//一个句柄绑定一个数据或一组数据
//③创建互斥对象等待副本
HANDLE Mutexes[2];
//④给副本赋值
Mutexes[0] = Mutex1;
Mutexes[1] = Mutex2;
//⑤等待两个对象全部激活
WaitForMultipleObjects(
2, //要等待的是两个对象
Mutexes, //要等待的互斥对象数组
TRUE, //等待全部
INFINITE //一直等待
);
printf("线程%d开始.......\n",(int)n);
printf("parameter1 = parameter1 + 1 * n\n");
printf("%d = %d + %d\n",(parameter1+1*(int)n),parameter1,1*(int)n);
printf("parameter2 = parameter2 + 2 * n\n");
printf("%d = %d + %d\n",(parameter2+2*(int)n),parameter2,2*(int)n);
parameter1 += (int)n*1;
parameter2 += (int)n*2;
printf("线程%d的计算结果%d,%d\n\n",(int)n,parameter1,parameter2);
//⑥ 副本互斥对象句柄释放
ReleaseMutex(Mutexes[0]);
ReleaseMutex(Mutexes[1]);
CloseHandle(Mutexes[0]);//释放
CloseHandle(Mutexes[1]);
return (int)n;
}