关于CreateMutex的疑问???

wangsiyuanoo 2011-06-29 04:00:30
下面的代码 我的理解是:

比如先进线程3,那线程3就拥有g_hMutex,线程4就阻塞在了WaitForSingleObject里,执行不下去,必须等到线程3释放掉了g_hMutex,线程4才能执行下去

程序运行的效果却有点让我模糊了

结果1:正常。线程3执行了ReleaseMutex,线程4才运行WaitForSingleObject下面的代码

结果2:一开始线程3和线程4一起执行WaitForSingleObject下面的代码一次!然后,线程3或线程4才有结果1的效果

为什么会出现这种情况,是我一开始的理解就不对么?


int iTickets = 3;
HANDLE g_hMutex;
unsigned __stdcall Thread3( void * obj )
{
while ( TRUE )
{
//先进来
//Thread3先拥有g_hMutex

WaitForSingleObject( g_hMutex, INFINITE );
if ( iTickets > 0 )
{
cout << "Thread3: " << iTickets-- << endl;
}
else
{
ReleaseMutex( g_hMutex );
break;
}
}

return 0;
}

unsigned __stdcall Thread4( void * obj )
{
while ( TRUE )
{
//后进来
//需要等待Thread3释放g_hMutex,Thread4才能拥有g_hMutex

WaitForSingleObject( g_hMutex, INFINITE );
if ( iTickets > 0 )
{
cout << "Thread4: " << iTickets-- << endl;
}
else
{
ReleaseMutex( g_hMutex );
break;
}
}
return 0;
}

void Test_Mutex()
{
HANDLE hThread3 = (HANDLE)_beginthreadex( NULL, 0, Thread3, NULL, 0, NULL );
HANDLE hThread4 = (HANDLE)_beginthreadex( NULL, 0, Thread4, NULL, 0, NULL );
CloseHandle( hThread3 );
CloseHandle( hThread4 );

g_hMutex = CreateMutex( NULL, FALSE, NULL );
}
...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
竞天问 2011-06-29
  • 打赏
  • 举报
回复
跟变速箱的“乱档”差不多啊,不过你熟不熟悉机械我就不知道了
maoxing63570 2011-06-29
  • 打赏
  • 举报
回复
死锁,你还是就去找本操作系统的书看下吧
wangsiyuanoo 2011-06-29
  • 打赏
  • 举报
回复
void Test_Mutex()
{
g_hMutex = CreateMutex( NULL, FALSE, NULL );

HANDLE hThread3 = (HANDLE)_beginthreadex( NULL, 0, Thread3, NULL, 0, NULL );
HANDLE hThread4 = (HANDLE)_beginthreadex( NULL, 0, Thread4, NULL, 0, NULL );

//这是等待线程3和4的结束,和死锁有什么关系?
WaitForSingleObject(hThread3, INFINITE);
WaitForSingleObject(hThread4, INFINITE);

CloseHandle( hThread3 );
CloseHandle( hThread4 );
}

Eleven 2011-06-29
  • 打赏
  • 举报
回复
#include <iostream>
#include <process.h>
using namespace std;

int iTickets = 4;
HANDLE g_hMutex;
unsigned __stdcall Thread3( void * obj )
{
while ( TRUE )
{
//ÏȽøÀ´
//Thread3ÏÈÓµÓÐg_hMutex

WaitForSingleObject( g_hMutex, INFINITE );
if ( iTickets > 0 )
{
cout << "Thread3: " << iTickets-- << endl;
}
else
{
ReleaseMutex( g_hMutex );
break;
}
ReleaseMutex( g_hMutex );
}

return 0;
}

unsigned __stdcall Thread4( void * obj )
{
while ( TRUE )
{
//ºó½øÀ´
//ÐèÒªµÈ´ýThread3ÊÍ·Åg_hMutex£¬Thread4²ÅÄÜÓµÓÐg_hMutex

WaitForSingleObject( g_hMutex, INFINITE );
if ( iTickets > 0 )
{
cout << "Thread4: " << iTickets-- << endl;
}
else
{
ReleaseMutex( g_hMutex );
break;
}
ReleaseMutex( g_hMutex );
}
return 0;
}

void Test_Mutex()
{
g_hMutex = CreateMutex( NULL, FALSE, NULL );

HANDLE hThread3 = (HANDLE)_beginthreadex( NULL, 0, Thread3, NULL, 0, NULL );
HANDLE hThread4 = (HANDLE)_beginthreadex( NULL, 0, Thread4, NULL, 0, NULL );

WaitForSingleObject(hThread3, INFINITE);
WaitForSingleObject(hThread4, INFINITE);
CloseHandle( hThread3 );
CloseHandle( hThread4 );
}

int main()
{
Test_Mutex();
return 0;
}
Eleven 2011-06-29
  • 打赏
  • 举报
回复
死锁 这个名字 有点难理解

能举个列子 说明 什么才叫死锁么???
-----------------------------
很简单,在主线程中创建线程,然后WaitForSingleObject()等待线程结束,在创建的子线程中SendMessage给UI窗口发送消息,这样就死锁了
wangsiyuanoo 2011-06-29
  • 打赏
  • 举报
回复
还有个问题

死锁 这个名字 有点难理解

能举个列子 说明 什么才叫死锁么???
wangsiyuanoo 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kyotrue 的回复:]
先创建了再使用!

g_hMutex = CreateMutex( NULL, FALSE, NULL );

HANDLE hThread3 = (HANDLE)_beginthreadex( NULL, 0, Thread3, NULL, 0, NULL );
HANDLE hThread4 = (HANDLE)_beginthreadex( NULL, 0, Threa……
[/Quote]

哦 您的意思是说 我先创建了线程 那么线程就启动了 就会出现同时运行两个线程的情况 是么?
kyotrue 2011-06-29
  • 打赏
  • 举报
回复
先创建了再使用!

g_hMutex = CreateMutex( NULL, FALSE, NULL );

HANDLE hThread3 = (HANDLE)_beginthreadex( NULL, 0, Thread3, NULL, 0, NULL );
HANDLE hThread4 = (HANDLE)_beginthreadex( NULL, 0, Thread4, NULL, 0, NULL );
CloseHandle( hThread3 );
CloseHandle( hThread4 );

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧