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"); }