现在我将这个event调用CloseHandle,
那么所有WaitForSingleObject的线程是否都会signal ?
我发现几个线程(3个)可以,多了(20个)就不行,有的线程没有被signal,msdn上没有关于这方面的介绍,
那位老大能够讲解一下,谢谢!
我用的mingw32,winxp
8 个解决方案
#1
看看Windows核心编程,应该有讲到吧。
#2
我试了一下,就写了一个线程,结果句柄关闭了,却还在等待....
楼主为什么问这个问题?
楼主为什么问这个问题?
#3
首先一定要知道句柄handler只是用来标识内核对象一些统计信息的一个数据结构,而不是内核对象本身
你可以通过句柄去访问和控制内核对象,但是关闭句柄CloseHandler只是将那个统计信息的数据结构的引用计数减少或者删除,其意义是,你告诉操作系统“我不再需要访问这个对象了”。但是操作系统并不会将内核对象摧毁。
所以,CloseHandler不会导致signal,要造成singal的只有调用SetEvent
你可以通过句柄去访问和控制内核对象,但是关闭句柄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
你可以通过句柄去访问和控制内核对象,但是关闭句柄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