找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: bao19830224

线程挂起问题

[复制链接]
 楼主| 发表于 2009-9-22 09:01:10 | 显示全部楼层
我把ACEd.pdb放到Debug目录下就可以跟进去了,谢谢winston

跟进去以后我发现执行t到hr_mgr()->testsuspend()这个函数体中的check_state()函数时,这里面有个申请守卫
ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, -1));的语句,

再继续跟进到
ACE_Guard<ACE_LOCK>::tryacquire (void)
{
  return this->owner_ = this->lock_->tryacquire ();
}

再继续跟进到
ACE_INLINE int
ACE_Thread_Mutex::acquire (void)
{
// ACE_TRACE ("ACE_Thread_Mutex::acquire");
  return ACE_OS::thread_mutex_lock (&this->lock_);
}

最后在
ACE_INLINE int
ACE_OS::thread_mutex_lock (ACE_thread_mutex_t *m)
{
  // ACE_OS_TRACE ("ACE_OS::thread_mutex_lock");
#if defined (ACE_HAS_THREADS)
# if defined (ACE_HAS_WTHREADS)
  ::EnterCriticalSection (m);
  return 0;
# else
  return ACE_OS::mutex_lock (m);
# endif /* ACE_HAS_WTHREADS */
#else
  ACE_UNUSED_ARG (m);
  ACE_NOTSUP_RETURN (-1);
#endif /* ACE_HAS_THREADS */
}
在其中的EnterCriticalSection (m);处不在运行阻塞了

是不是形成了死锁?
发表于 2009-9-22 10:45:49 | 显示全部楼层
确实是死锁了,
建议将tt1.thr_mgr()->suspend(tt1.threadID_);
拿到外面试一下。
 楼主| 发表于 2009-9-22 10:58:20 | 显示全部楼层
谢谢modern

modern说的拿到外面去是什么意思? 是另一个程序的意思吗?
发表于 2009-9-22 11:08:00 | 显示全部楼层
不是另一个程序,而是放在svc函数外面,
比如将tt1.thr_mgr()->suspend(tt1.threadID_);
放到main函数里面。
 楼主| 发表于 2009-9-22 11:46:34 | 显示全部楼层
放在外面虽然不阻塞了,但是结果不对。我这样写的main函数

int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  test1 tt1;
  tt1.open();
  ACE_OS::sleep(1);
  tt1.thr_mgr()->suspend(tt1.threadID_);
  int ret = tt1.thr_mgr()->testsuspend(tt1.threadID_);
  cout<<ret<<endl;
  return 0;
}

ret返回 0,按道理应该返回 1 才对
 楼主| 发表于 2009-9-24 08:41:53 | 显示全部楼层
我觉得这个思路是解决不了这个问题,各位版主还有什么别的思路吗?:)
发表于 2009-9-24 09:48:43 | 显示全部楼层
我跑了你的程序,testsuspend的返回值是1没错、、
 楼主| 发表于 2009-9-24 09:51:26 | 显示全部楼层
不会吧 modern 我在跑跑看
 楼主| 发表于 2009-9-24 10:08:50 | 显示全部楼层
我怎么还是0啊 我是这样写的程序 modern帮忙看看是不是那个地方有错

//头文件
class test1: public ACE_Task<ACE_MT_SYNCH>
{
public:
test1(){}
virtual int open (void *args = 0);
virtual int svc (void);
ACE_thread_t threadID_;
};

//cpp文件
int test1::open(void *args )
{
  int ret=this->activate (THR_SCOPE_SYSTEM|THR_JOINABLE);
  if(ret<0)
  {
    return -1;
  }
  return 0;
}

int test1::svc()
{
   threadID_=ACE_Thread::self();
}

int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  test1 tt1;
  tt1.open();
  ACE_OS::sleep(1);
  tt1.thr_mgr()->suspend(tt1.threadID_);
  int ret = tt1.thr_mgr()->testsuspend(tt1.threadID_);
  cout<<ret<<endl;
  return 0;
}
发表于 2009-9-24 10:13:39 | 显示全部楼层
大哥,你的线程已经退出了,不返回0才怪。
int test1::svc()
{
   threadID_=ACE_Thread::self();
while(1)
{
}
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 19:47 , Processed in 0.020125 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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