跨進程的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"); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM