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);处不在运行阻塞了
是不是形成了死锁?
modern
发表于 2009-9-22 10:45:49
确实是死锁了,
建议将tt1.thr_mgr()->suspend(tt1.threadID_);
拿到外面试一下。
bao19830224
发表于 2009-9-22 10:58:20
谢谢modern
modern说的拿到外面去是什么意思? 是另一个程序的意思吗?
modern
发表于 2009-9-22 11:08:00
不是另一个程序,而是放在svc函数外面,
比如将tt1.thr_mgr()->suspend(tt1.threadID_);
放到main函数里面。
bao19830224
发表于 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 才对
bao19830224
发表于 2009-9-24 08:41:53
我觉得这个思路是解决不了这个问题,各位版主还有什么别的思路吗?:)
modern
发表于 2009-9-24 09:48:43
我跑了你的程序,testsuspend的返回值是1没错、、
bao19830224
发表于 2009-9-24 09:51:26
不会吧 modern 我在跑跑看
bao19830224
发表于 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;
}
modern
发表于 2009-9-24 10:13:39
大哥,你的线程已经退出了,不返回0才怪。
int test1::svc()
{
threadID_=ACE_Thread::self();
while(1)
{
}
}