找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 15518|回复: 5

问一个关于线程的问题,如何杀死线程

[复制链接]
发表于 2010-1-26 23:24:46 | 显示全部楼层 |阅读模式
在ACE_Task_Base的virtual int svc (void)回调中如果发生死锁的事情,那么ACE_Task_Base的wait函数也将死锁,请问如何在svc中发生死锁的情况下,杀掉线程,顺便说明一下,是win平台。
发表于 2010-1-27 08:53:58 | 显示全部楼层
合理避免死锁,程序设计时不要冲着死锁去呀。
发表于 2010-1-29 14:57:43 | 显示全部楼层
这样做,对于死锁的线程,要做一个定时器定时自检。
在handle_timeout加入自己对线程是否死锁的验证,我的验证方法是,线程函数进入和出去两个时间相减大于一个固定值的时候,就杀死重启线程。

                                //发现阻塞线程,重启相应的线程
                                ACE_OS::thr_kill(pThreadInfo->m_u4ThreadIndex, SIGALRM);

查一下这个函数,在SVC下可以停止你的异常线程。
发表于 2010-1-29 17:23:34 | 显示全部楼层
貌似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 */
}
 楼主| 发表于 2010-1-29 22:02:19 | 显示全部楼层

问题的起因

我在项目中要异步的调用另外同事的api函数。但是同事的api又不能保证不死锁。所以我要有个机制来杀掉死锁的svc

modern说的是对的,ACE_OS::thr_kill 在windows下确实没有实现杀死线程的方法。所以我才问问是不是我没有找对地方

但我还是想说一句:

如果ACE不提供这样的机制,那又如何释放死锁的资源呢,是不是也太花瓶了点啊,哪里谈的上工业强度啊。

[ 本帖最后由 shenming 于 2010-1-29 22:14 编辑 ]
发表于 2010-2-9 22:54:28 | 显示全部楼层
不能保证不死锁, 应该从你的同事那里找解决问题的方案吧? 并不是你去找能够杀死死锁的方法.
就算让你找到这样的方法, 也不能说明没问题了.应该从你同事的提供的API上去找问题.

好的系统架构分层管理, 严格的锁的使用顺序, 好的二元书写习惯都可以避免死锁.

绝大部分的死锁都是出现在系统架构分层不明确, 锁的使用顺序错综复杂
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-6-26 20:44 , Processed in 0.014614 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表