如何结束阻塞状态的线程?
要完整的释放资源,因为线程控制了数据库连接,SOCKET和其他一些要释放的资源. 问题点数:50、回复次数:10Top
1 楼wagzt724(蓝天)回复于 2005-02-06 09:14:46 得分 0
给个思路吧,必须用另外的一个“第三者”来终止阻塞线程,但涉及到系统权限。Top
2 楼tabris17(四不象)回复于 2005-02-06 09:19:20 得分 35
把该线程使用的资源情况添到一个列表中
第三者将根据这个列表来释放资源
typedef struct _HANDLE_LIST{
DWORD dwHandleType;
HANDLE handle;
}HandleList;
HandleList[100];Top
3 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-02-06 11:05:46 得分 0
像SOCKET这样的资源,由于线程阻塞式地调用了recv,能够把这个SOCKET释放吗?Top
4 楼BigFanOfCpp(((Bytes)+_ALGIN-1) & ~(_ALGIN-1))回复于 2005-02-06 21:34:21 得分 5
HANDLE m_hEvent = ::CreateEvent(NULL,TRUE,FALSE,"");
::ResetEvent(m_hEvent);
线程函数里:
for (;;)
{
if (WAIT_OBJECT_0 == ::WaitForSingleObject(m_hEvent,10000))
{
::CloseHandle(m_hEvent);
return 1;
}
}
Top
5 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-02-06 21:49:19 得分 0
不是这么回事,是我的线程会因为SOCKET的操作阻塞.我要结束这个线程.Top
6 楼najzni(najzni)回复于 2005-02-06 22:28:59 得分 0
学习Top
7 楼BigFanOfCpp(((Bytes)+_ALGIN-1) & ~(_ALGIN-1))回复于 2005-02-07 00:40:03 得分 0
想要线程安全结束,只有让线程自己return 1;对吧?
所以需要让线程等待外面的某个核心对象,然后自己return 1;
我刚刚写的那段程序就是这个意思,你可以借鉴一下,因为原理都是一样的.Top
8 楼tabris17(四不象)回复于 2005-02-07 20:20:18 得分 10
to BigFanOfCpp(vc程序员):
你还是没懂楼主的意思,线程已经阻塞了,如何再去调用WaitForSingleObject来等待事件?
>像SOCKET这样的资源,由于线程阻塞式地调用了recv,能够把这个SOCKET释放吗?
应该可以,不过没试过,不是很肯定Top
9 楼tabris17(四不象)回复于 2005-02-07 20:21:21 得分 0
如果关闭socket,阻塞的recv应该会立即返回失败Top
10 楼XueBoy163(菜刀之恋)回复于 2005-02-07 21:40:16 得分 0
recv可以阻塞有时间设定的吧?Top




