多线程同步之Mutex(互斥对象)

来源:互联网 发布:义乌淘宝培训学校排名 编辑:程序博客网 时间:2024/05/22 03:17

//多线程同步
//互斥对象的应用
#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;
}

 

 

 

原创粉丝点击