关于WaitForSingleObject。,CreateEvent和CloseHandle

时间:2022-01-27 20:37:30
我有多个线程,在同一个event上等待 WaitForSingleObject
现在我将这个event调用CloseHandle,
那么所有WaitForSingleObject的线程是否都会signal ?
我发现几个线程(3个)可以,多了(20个)就不行,有的线程没有被signal,msdn上没有关于这方面的介绍,
那位老大能够讲解一下,谢谢!
我用的mingw32,winxp

8 个解决方案

#1


看看Windows核心编程,应该有讲到吧。

#2


我试了一下,就写了一个线程,结果句柄关闭了,却还在等待....

楼主为什么问这个问题?

#3


首先一定要知道句柄handler只是用来标识内核对象一些统计信息的一个数据结构,而不是内核对象本身

你可以通过句柄去访问和控制内核对象,但是关闭句柄CloseHandler只是将那个统计信息的数据结构的引用计数减少或者删除,其意义是,你告诉操作系统“我不再需要访问这个对象了”。但是操作系统并不会将内核对象摧毁。

所以,CloseHandler不会导致signal,要造成singal的只有调用SetEvent

#4


内核对象的引用计数到0以后,不就没了吗??

#5


是用于统计内核对象信息的一个数据结构的引用计数,不是内核对象的引用计数

#6



我试了一下,就写了一个线程,结果句柄关闭了,却还在等待....

楼主为什么问这个问题?

-------------
你用的是什么编译器?我用了bcc55和mingw32,出现的效果一样。

#include <windows.h>
int t1_fun(void *p){
HANDLE h= (HANDLE)p;
WaitForSingleObject(p, INFINITE);
cerr<<"thread Exit\n";
}

int main(int argc, char** argv){
HANDLE t[1];
HANDLE evt= CreateEvent(0,FALSE, FALSE, 0); 
ResetEvent (evt);
for( int i=0; i< sizeof(t)/sizeof(t[0]); i++){
t[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE )t1_fun,  (void*)evt, 0, NULL);
}
//SetEvent(evt);Sleep(1);

//for( int i=0; i< sizeof(t)/sizeof(t[0]); i++) {SetEvent(evt); }
CloseHandle(evt);
for( int i=0; i< sizeof(t)/sizeof(t[0]); i++){
WaitForSingleObject(t[i],INFINITE); 
CloseHandle(t[i]);
}

Sleep(1000);
}
t[] 为1时程序可以退出。为20就不行,
而且每次被singal的线程次数都不一样,5-16个左右。
这个行为可能是windows未定义的,也可能和库实现相关。
那位有vc编译器,编译一下看看结果。

#7


up

#8


up

#1


看看Windows核心编程,应该有讲到吧。

#2


我试了一下,就写了一个线程,结果句柄关闭了,却还在等待....

楼主为什么问这个问题?

#3


首先一定要知道句柄handler只是用来标识内核对象一些统计信息的一个数据结构,而不是内核对象本身

你可以通过句柄去访问和控制内核对象,但是关闭句柄CloseHandler只是将那个统计信息的数据结构的引用计数减少或者删除,其意义是,你告诉操作系统“我不再需要访问这个对象了”。但是操作系统并不会将内核对象摧毁。

所以,CloseHandler不会导致signal,要造成singal的只有调用SetEvent

#4


内核对象的引用计数到0以后,不就没了吗??

#5


是用于统计内核对象信息的一个数据结构的引用计数,不是内核对象的引用计数

#6



我试了一下,就写了一个线程,结果句柄关闭了,却还在等待....

楼主为什么问这个问题?

-------------
你用的是什么编译器?我用了bcc55和mingw32,出现的效果一样。

#include <windows.h>
int t1_fun(void *p){
HANDLE h= (HANDLE)p;
WaitForSingleObject(p, INFINITE);
cerr<<"thread Exit\n";
}

int main(int argc, char** argv){
HANDLE t[1];
HANDLE evt= CreateEvent(0,FALSE, FALSE, 0); 
ResetEvent (evt);
for( int i=0; i< sizeof(t)/sizeof(t[0]); i++){
t[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE )t1_fun,  (void*)evt, 0, NULL);
}
//SetEvent(evt);Sleep(1);

//for( int i=0; i< sizeof(t)/sizeof(t[0]); i++) {SetEvent(evt); }
CloseHandle(evt);
for( int i=0; i< sizeof(t)/sizeof(t[0]); i++){
WaitForSingleObject(t[i],INFINITE); 
CloseHandle(t[i]);
}

Sleep(1000);
}
t[] 为1时程序可以退出。为20就不行,
而且每次被singal的线程次数都不一样,5-16个左右。
这个行为可能是windows未定义的,也可能和库实现相关。
那位有vc编译器,编译一下看看结果。

#7


up

#8


up