跨进程的mutex
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[100] = "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[100] = "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, 20000);
switch (res)
{
case WAIT_OBJECT_0:
printf("收到信号-------");
break;
case WAIT_TIMEOUT:
printf("超时没有收到-------");
break;
case WAIT_ABANDONED:
printf("另外⼀个进程意外终⽌-------");
break;
default:
break;
}
CloseHandle(mutex);
一个线程可以包含多个进程system("pause");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论