zoukankan      html  css  js  c++  java
  • 跨进程的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"); }
  • 相关阅读:
    线段树模板题 contest 线段树 T5
    Guide AHOI2017 洛谷P3720
    静态RMQ模板题 contest 静态RMQ T2
    树状数组模板题 P1904
    AC自动机模板题 P2017
    高精度排序模板题 P1110
    Trie树模板题 P2016
    树状数组套权值线段树
    爬山 启发式合并 / STL
    [POI2011]ROT-Tree Rotations 线段树合并|主席树 / 逆序对
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5792132.html
Copyright © 2011-2022 走看看