最高100分。我在主程序中创建了两个用CWinThread派生的线程,原意是让两个线程通过一个mutex读取一公共变量区。但是奇怪的是总是有一个线程得不到mutex。线程A: 被timer 唤醒,
if (waitforsingleobject(h_mutex))
写数据,then release h_mutex
else return;线程B: //不停的扫描循环
while (1)
{
if ( waitforsingleobject(h_mutex))
读书据,then release h_mutex
else
Sleep(1000);
}我试过在主程序中创建mutex(用CreateMutex),然后将句柄传给线程A,B,也试过在线程A中创建mutex,然后在B中用openmutex通过mutex名得到mutex的句柄。不论用哪种情况,都是同样的问题:如果A先得到mutex,B就永远得不到mutex,反之亦然。但是releasemutex又从来不报错。我很不理解是为什么,请哪位高手指点一下,谢谢。
if (waitforsingleobject(h_mutex))
写数据,then release h_mutex
else return;线程B: //不停的扫描循环
while (1)
{
if ( waitforsingleobject(h_mutex))
读书据,then release h_mutex
else
Sleep(1000);
}我试过在主程序中创建mutex(用CreateMutex),然后将句柄传给线程A,B,也试过在线程A中创建mutex,然后在B中用openmutex通过mutex名得到mutex的句柄。不论用哪种情况,都是同样的问题:如果A先得到mutex,B就永远得不到mutex,反之亦然。但是releasemutex又从来不报错。我很不理解是为什么,请哪位高手指点一下,谢谢。
解决方案 »
- winbase.h的SetDllDirectory()函数使用不了。
- CDHtmlDialog 有没有遇到过无法进入OnNewWindow3的情况啊?
- 有木有高手对SIFT算法有研究
- 这一句,不懂
- 关于释放内存的问题,急!!!
- 请大家推荐一本适合自学的计算机原理方面的书?
- 请问一下,一个简单的消息发送怎么不响应呀
- 求助。简单的IP扫描程序运行出错
- 断开上网
- 请问如何象金山词霸那样取得鼠标位置上的文字?
- 当按鼠标右键点GO TO definition ...时总要建立*.BSC文件,能否在编译时自动建立?
- 如何实现在同一进程的不同窗口传送简单字符串(不能用全局变量、静态变量、及共享内存), 最好是通过消息之类的?
if(dwRet==WAIT_OBJECT_0)
FunctionA(),FunctionB()是CMyTabExampleApp的静态成员函数,m_hMutex是它的静态成员变量。在CMyTabExampleApp::InitInstance()中创建m_hMutex,initOwer=FALSE。然后用AfxBeginThread()创建两个线程。结果:
B i=0
.
.
.
B i=999
A i=0
.
.
.UINT CMyTabExampleApp::FunctionA(void *p)
{
while(1)
{
DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
if(dwRet==WAIT_OBJECT_0)
{
for(int i=0;i<1000;i++)
{
TRACE("A i=%d\n",i);
}
::ReleaseMutex(m_hMutex);
}
Sleep(0);
}
return 0;
}UINT CMyTabExampleApp::FunctionB(void *p)
{
while(1)
{
DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
if(dwRet==WAIT_OBJECT_0)
{
for(int i=0;i<1000;i++)
{
TRACE("B i=%d\n",i);
}
::ReleaseMutex(m_hMutex);
}
Sleep(0);
}
return 0;
}
我想你的function A 和function B 就是thread A,B的执行程序吧。
我的代码跟你不一样的地方就是所有跟mutex有关的API没有加::,我会试试看。但是你的结果好像并不是我所期望的那样,似乎你的B thread 一直霸占了mutex,直到thread结束才交给Thread A ,而我的程序里是需要两个thread一直相互交流信息的。To: zhaolaoxin(), shinesi(DaBaiCai)
我才开始做线程间的通信,的确有些概念不是特别清晰。为什么不能释放mutex,mutex的本意应该是互斥信号灯,如果A不释放,B怎么能得到?而且我觉得很多同步信号例如mutex,event,还有一个semphere(?),似乎都可以通用,只是实现的方式不太一样而已。我说的有不对的地方还请多多指教。
A i=0
.
.
.
A i=999
B i=0
.
.
.
B i=999
A i=0
.
.
.请不要太相信TRACE()的输出结果.
旧程序代码是:
dwWaitResult = ::WaitForSingleObject(hMutex,1000L);
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
//Do my jobs here if (! ::ReleaseMutex ( hhMutex ))
{ //error process }
break;
case WAIT_TIMEOUT:
//.....
break; case WAIT_ABANDONED:
//.....
break;
case WAIT_FAILED:
//......
break; }现在在最后添加了一句:
::ReleaseMutex ( hMutex );有可能是存在未公开的返回值。不过我现在改用CRITICAL_SECTION作了,这个方法适用我的程序,而且更简单。