线程间的互斥:
eg:
//共享资源
static int num = 0;
//互斥锁
HANDLE g_Mutex = CreateMutex(NULL, FALSE, NULL);
//子线程函数
unsigned int __stdcall ChildThreadFunc(LPVOID pM)
{
while (true)
{
Sleep(500);
WaitForSingleObject(g_Mutex, INFINITE);//等待互斥量 INFINITE表示永远等待
num++;
printf("num:%d\n", num);
ReleaseMutex(g_Mutex);
}
return 0;
}
int main()
{
HANDLE handle[5] = { 0 };
for (int i = 0; i < 5; i++)
{
handle[i] = (HANDLE)_beginthreadex(NULL, 0, ChildThreadFunc, NULL, 0, NULL);
}
//阻塞等待
for (int i = 0; i < 5; i++)
{
WaitForSingleObject(handle[i], -1);
}
printf("主线程 num:%d\n", num);
getchar();
return 0;
}
进程中使用互斥量与在线程中使用其原理和操作流程相同,唯一区别在于线程中可以不为互斥量指定名称,而在进程中需要指定名称,由此其他进程可以根据名称获取该互斥量的句柄。
eg: 两个进程共享名字为pmutex的互斥量
其中一个进程代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄
// Mutex 可以跨进程使用,所以其名称对整个系统而言是全局的,所以命名不要过于普通,类似:Mutex、Object 等。
HANDLE hMutex = CreateMutex(NULL, false, "mypmutex");
if(NULL == hMutex)
{
cout<<"create mutex error "<<GetLastError()<<endl;
return 0;
}
else
{
cout<<" create mutex success:"<<hMutex