问个关于WaitForSingleObject的问题

yxlovemoney 2013-03-12 05:50:43
在Windows核心编程中是这样说
"如果线程在调用一个等待函数的时候,相应的内核对象已处于触发状态,那么线程是不会进入等待状态的."

比如我有以下的程序.


#include<windows.h>
#include<winbase.h>
#include<stdio.h>
#include <process.h>


HANDLE g_hMutex = CreateMutex(NULL, FALSE, "mutex");

unsigned int WINAPI ThreadProcOne(LPVOID lpVoid)
{
int i;

for(i = 0; i < 4; ++i)
{// 走到此可继续招待下面的语句,那说明内核对象处于触发状态.
// 这里不明白的是怎么知道内核对象到底处于什么状态.
WaitForSingleObject(g_hMutex, INFINITE);
printf("Thread1:%d\n", i);
ReleaseMutex(g_hMutex);
}
return 0;
}

unsigned int WINAPI ThreadProcTwo(LPVOID lpVoid)
{
int i;

for(i = 0; i < 4; ++i)
{
WaitForSingleObject(g_hMutex, INFINITE);
printf("Thread2:%d\n", i);
ReleaseMutex(g_hMutex);
}
return 0;
}

int main(int argc, char *argv[])
{
unsigned int threadID;
//InitializeSRWLock(&g_srwlock);
// CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcOne, NULL, 0, NULL);
// CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcTwo, NULL, 0, NULL);

HANDLE handle1 = (HANDLE)_beginthreadex(NULL, 0, ThreadProcOne, NULL, 0, &threadID);
HANDLE handle3 = (HANDLE)_beginthreadex(NULL, 0, ThreadProcOne, NULL, 0, &threadID);
HANDLE handle2 = (HANDLE)_beginthreadex(NULL, 0, ThreadProcTwo, NULL, 0, &threadID);
Sleep(1000);
//getchar();
//system("PAUSE");
return 0;
}

(再发次问题)
// 走到此可继续招待下面的语句,那说明内核对象处于触发状态.
// 这里不明白的是怎么知道内核对象到底处于什么状态.
...全文
85 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxlovemoney 2013-03-15
  • 打赏
  • 举报
回复
非常感谢大家的解释都非常有用
  • 打赏
  • 举报
回复
请查看MSDN CreateMutex 的说明
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
引用 2 楼 ganpengjin1 的回复:
设置为FALSE时,是要手动SetEvent才行,不然会一直等待被触发!
打说了,是要先ReleaseEvent
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
设置为FALSE时,是要手动SetEvent才行,不然会一直等待被触发!
lm_whales 2013-03-13
  • 打赏
  • 举报
回复
Mutex没有任何线程拥有处于触法态。 一旦有一个线程等到Mutex则该线程拥有他,直到释放为止,则Mutex处于非触发态。 创建的线程,可以通过把第二个参数传入TRUE来立即拥有Mutex(不用等待)。则Mutex处于非触发态!
moolleychean 2013-03-12
  • 打赏
  • 举报
回复
第二个参数传入FALSE, mutex 互斥量内核对象的线程ID和递归计数都被设为0,这意味着互斥量不为任何线程占用,处于触发状态。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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