跨进程的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"); }
原文地址:https://www.cnblogs.com/sjxbg/p/5792132.html