问一个关于线程的问题,如何杀死线程
在ACE_Task_Base的virtual int svc (void)回调中如果发生死锁的事情,那么ACE_Task_Base的wait函数也将死锁,请问如何在svc中发生死锁的情况下,杀掉线程,顺便说明一下,是win平台。 合理避免死锁,程序设计时不要冲着死锁去呀。 这样做,对于死锁的线程,要做一个定时器定时自检。在handle_timeout加入自己对线程是否死锁的验证,我的验证方法是,线程函数进入和出去两个时间相减大于一个固定值的时候,就杀死重启线程。
//发现阻塞线程,重启相应的线程
ACE_OS::thr_kill(pThreadInfo->m_u4ThreadIndex, SIGALRM);
查一下这个函数,在SVC下可以停止你的异常线程。 貌似thr_kill在windows下没有做具体实现吧
ACE_INLINE int
ACE_OS::thr_kill (ACE_thread_t thr_id, int signum)
{
ACE_OS_TRACE ("ACE_OS::thr_kill");
#if defined (ACE_HAS_THREADS)
# if defined (ACE_HAS_PTHREADS)
# if defined (ACE_LACKS_PTHREAD_KILL)
ACE_UNUSED_ARG (signum);
ACE_UNUSED_ARG (thr_id);
ACE_NOTSUP_RETURN (-1);
# else
int result;
ACE_OSCALL_RETURN (ACE_ADAPT_RETVAL (pthread_kill (thr_id, signum),
result),
int, -1);
# endif /* ACE_LACKS_PTHREAD_KILL */
# elif defined (ACE_HAS_STHREADS)
int result;
ACE_OSCALL_RETURN (ACE_ADAPT_RETVAL (::thr_kill (thr_id, signum),
result),
int, -1);
# elif defined (ACE_HAS_VXTHREADS)
//FUZZ: disable check_for_lack_ACE_OS
ACE_OSCALL_RETURN (::kill (thr_id, signum), int, -1);
//FUZZ: enable check_for_lack_ACE_OS
# else
ACE_UNUSED_ARG (thr_id);
ACE_UNUSED_ARG (signum);
ACE_NOTSUP_RETURN (-1);
# endif /* ACE_HAS_STHREADS */
#else
ACE_UNUSED_ARG (thr_id);
ACE_UNUSED_ARG (signum);
ACE_NOTSUP_RETURN (-1);
#endif /* ACE_HAS_THREADS */
}
问题的起因
我在项目中要异步的调用另外同事的api函数。但是同事的api又不能保证不死锁。所以我要有个机制来杀掉死锁的svcmodern说的是对的,ACE_OS::thr_kill 在windows下确实没有实现杀死线程的方法。所以我才问问是不是我没有找对地方
但我还是想说一句:
如果ACE不提供这样的机制,那又如何释放死锁的资源呢,是不是也太花瓶了点啊,哪里谈的上工业强度啊。
[ 本帖最后由 shenming 于 2010-1-29 22:14 编辑 ] 不能保证不死锁, 应该从你的同事那里找解决问题的方案吧? 并不是你去找能够杀死死锁的方法.
就算让你找到这样的方法, 也不能说明没问题了.应该从你同事的提供的API上去找问题.
好的系统架构分层管理, 严格的锁的使用顺序, 好的二元书写习惯都可以避免死锁.
绝大部分的死锁都是出现在系统架构分层不明确, 锁的使用顺序错综复杂
页:
[1]