1.操作系统分为ring0(内核层)和ring3(应用层)两层。
- ring0层出错会蓝屏,ring3层出错程序就会挂了。
- event和mutex创建他的指针是应用层,但是它的内部是ring0层,ring0层可以看到所有的进程的内存。一个进程不能读写另外一个进程的内存,我们必须通过注释的方式
- event和mutex其实都是在ring0层创建了一个对象。它不仅仅可以用于一个线程内的互斥,也可以用于多个进程之间的线程互斥。
2.mutex跨进程
- event(事件),semaphore(信号量)mutex(互斥量)都是可以跨进程来进行线程互斥和线程通信的。但是mutex是最安全的,不要选用信号量和事件。
- 跨进程都必须要有名字,否则找不到。
- 跨进程时,一定设置一个等待时间,等的时间太久就不要在等了。
- mutex是一个内核层的对象,哪个进程都可以访问他。
HANDLE mutex = CreateMutex(NULL, TRUE, name) //在内核创建
ReleaseMutex(mutex); //离开互斥区
HANDLE mutex = OpenMutex(MUTEX_ALL_ACCESS,TRUE,name); //打开
MUTEX_ALL_ACCESS查找全部
3.使用(两个进程)
mutex1:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h> char name[] = "haihualovefang"; void main()
{
HANDLE mutex = CreateMutexA(NULL, TRUE, name); //在内核创建
printf("创建成功");
char ch = getch(); ReleaseMutex(mutex); //离开互斥区
printf("触发互斥量");
CloseHandle(mutex); }
mutex2:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h> char name[] = "haihualovefang"; void main()
{ HANDLE mutex = OpenMutexA(MUTEX_ALL_ACCESS,TRUE,name);
//MUTEX_ALL_ACCESS查找全部
if (mutex==NULL)
{
printf("打开失败");
system("pause");
return;
}
printf("等待-------");
DWORD res = WaitForSingleObject(mutex, );
switch (res)
{
case WAIT_OBJECT_0:
printf("收到信号-------");
break;
case WAIT_TIMEOUT:
printf("超时没有收到-------");
break;
case WAIT_ABANDONED:
printf("另外一个进程意外终止-------");
break;
default:
break; }
CloseHandle(mutex); system("pause");
}