问个关于WaitForSingleObject的问题

yxlovemoney yxlovemoney 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在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;
}

(再发次问题)
// 走到此可继续招待下面的语句,那说明内核对象处于触发状态.
// 这里不明白的是怎么知道内核对象到底处于什么状态.
...全文
评论 6
收藏 已收藏
分享
返回顶部
yxlovemoney
C++ 语言 65,214 成员 250,514 内容