以下是在网上随便找的例子:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
HANDLE mutex;//互斥句柄
DWORD WINAPI ThreadProc1( LPVOID lpParameter )
{
while(1)
{
::WaitForSingleObject(mutex,100);
cout<<"Sub Thread is run!"<<endl;
::Sleep(1000);//注意这里
::ReleaseMutex(mutex);
}
}
void main()
{
mutex=::CreateMutex(NULL,FALSE,L"MUTEX");
HANDLE handle=::CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
CloseHandle(handle);
while(1)
{
::WaitForSingleObject(mutex,100);
cout<<"Main Thread is run!"<<endl;
::Sleep(1000);注意这里
::ReleaseMutex(mutex);
}
}
这个例子 线程完全可以正常的同步运行
下面有两个问题
1:假如现在主线程执行了::ReleaseMutex(mutex); 那么主线程自己就不能再抓住这个机会再走近自己的线程函数中吗 为啥主线程ReleaseMutex之后一定是ThreadProc1抓住了这个执行线程函数的机会呢
2:如果将主线程和ThreadProc1中的两个Sleep(1000)都放在各自线程函数的ReleaseMutex的后面 为啥就有的时候不能同步了呢 就是说 有的时候 打印两次"Main Thread is run!"或者两次"Sub Thread is run!"呢
最好从内核工作的角度说说
------解决方案--------------------------------------------------------
为啥主线程ReleaseMutex之后一定是ThreadProc1抓住了这个执行线程函数的机会呢
============
你的进程中只有两个线程,当然是ThreadProc1被调度到,当然并不是说主线程一阻塞,ThreadProc1就会马上调度到,中间可能会出现CPU被别的进程中的线程调度的情况。
------解决方案--------------------------------------------------------
Mutex有个线程所有权概念,你在其他线程中调用ReleaseMutex操作系统直接忽略
------解决方案--------------------------------------------------------
Mutex 线程所有权互换。
谁用Wait函数等到Mutex的信号状态,那么谁拥有Mutex的所有权,这个线程调用ReleaseMutex才有效。
------解决方案--------------------------------------------------------