【发布时间】:2013-03-29 08:45:02
【问题描述】:
根据this
"如果一个线程调用pthread_exit,但是,C++ 不保证析构函数是
调用线程堆栈上的所有自动变量。一个聪明的方法来恢复这个
功能是在线程函数的顶层调用 pthread_exit
抛出一个特殊的异常”。
后面跟着这段代码
class ThreadExitException
{
public:
ThreadExitException (void* return_value)
: thread_return_value_ (return_value) { }
void* DoThreadExit ()
{
pthread_exit (thread_return_value_);
}
private:
void* thread_return_value_;
};
void do_some_work ()
{
while (1)
{
/* Do some useful things here...*/
if (should_exit_thread_immediately ())
throw ThreadExitException (/* thread’s return value = */ NULL);
}
}
void* thread_function (void*)
{
try
{
do_some_work ();
}
catch (ThreadExitException ex)
{
ex.DoThreadExit ();
}
return NULL;
}
据我了解... 如果调用 pthread_exit ,则可能不会调用堆栈的所有自动变量的析构函数。 因此我们使用异常处理来确保为所有变量调用析构函数。 (引自解释:“通过抛出 ThreadExitException 而不是 直接调用pthread_exit,异常被顶级线程函数捕获,线程栈上的所有局部变量都会被正确销毁 异常渗出。”
根据pthread_exit的手册页
“任何由 pthread_cleanup_push(3) 建立的尚未被弹出的清理处理程序都会被弹出(与它们被推送的顺序相反)并且 执行。 如果线程有任何线程特定的数据,则在执行清理处理程序后,调用相应的析构函数,在 一个未指定的订单”。
这表示函数调用了析构函数,所以自动变量会被释放?那为什么要使用代码中演示的异常处理呢?
【问题讨论】: