读书人

小疑点 线程同步

发布时间: 2012-02-24 16:30:39 作者: rapoo

小问题 线程同步
以下是在网上随便找的例子:

#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

读书人网 >软件开发

热点推荐