<一>互斥的同步机制
思想:当一个线程获得互斥量了后,其他所有要获取同一个互斥量的线程都处于阻塞状态,直到第一个线程释放互斥量为止。
设想几个线程竞争同一个互斥量,其中一个线程获得了互斥量。其他线程将被阻塞,进入睡眠状态。处于睡眠状态的线程几乎不消耗资源,这就有利于提高系统的运行效率。当占有互斥量的线程释放互斥量时,等待该互斥量的所有线程都将被“唤醒”,这些线程一起竞争该互斥量。
<二>Win32 API中的互斥函数
函数名 | 作用 |
CreateMutex | 创建一个新的互斥量 |
OpenMutex | 打开一个已有的互斥量 |
ReleaseMutex | 释放互斥量 |
WaitForSingleObject | 等待某个事件 |
以上的各个函数的具体用法参看Win32 API手册。在此只是列举各函数的一点点注意事项。
- CreateMutex函数返回的句柄对互斥量有完全的控制权;
- 多个线程可以同时调用CreateMutex函数来创建同名的互斥对象。但实际上只有第一个调用CreateMutex的线程真正创建了互斥对象,其他线程都只是打开已有的互斥对象句柄。
- 调用ReleaseMutex函数的线程,如果它没有拥有该互斥对象,那么调用ReleaseMutex失败;
如下例子:
#include <iostream> #include <windows.h> #include "process.h" using namespace std; HANDLE hMutex; int a[5],i; void Thread() { int num=0; while(true) { WaitForSingleObject(hMutex,INFINITE); for (i=0;i<5;i++) { a[i]=num; } ReleaseMutex(hMutex); num++; } } int main() { hMutex=CreateMutex(NULL,FALSE,NULL); //_beginthread(Thread,0,NULL); //_beginthread(Thread,0,NULL); CreateThread(0,0,(LPTHREAD_START_ROUTINE)Thread,0,0,0); while(true) { WaitForSingleObject(hMutex,INFINITE); for (i=0;i<5;i++) { cout<<a[i]<<" "; } ReleaseMutex(hMutex); } CloseHandle(hMutex); return 0; }