首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

小疑点 线程同步

2012-02-24 
小问题 线程同步以下是在网上随便找的例子:#include stdafx.h#include windows.h#include iostreamu

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

#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

热点排行