当前位置: 代码迷 >> 多核软件开发 >> 小疑点 线程同步
  详细解决方案

小疑点 线程同步

热度:8475   发布时间:2013-02-26 00:00:00.0
小问题 线程同步
以下是在网上随便找的例子:

#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才有效。


------解决方案--------------------------------------------------------
探讨
28874414
  相关解决方案