gpt4 book ai didi

c++ - 关于 pthread_exit 释放自动变量的混淆

转载 作者:行者123 更新时间:2023-11-27 23:17:08 25 4
gpt4 key购买 nike

根据 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) 建立的尚未被弹出的清理处理程序被弹出(以与它们被推送的顺序相反的顺序)并且 执行。 如果线程有任何线程特定的数据,那么在执行完清理处理程序后,将调用相应的析构函数,在 未指定的订单”。

这表示为函数调用了析构函数,因此自动变量将被释放?。那么为什么有必要使用代码所展示的异常处理呢?

最佳答案

线程特定数据与您所理解的有所不同。线程特定数据是已设置的全局数据,以便每个线程都获得全局数据的单独拷贝。因此,线程特定数据并不像您假设的那样存在于堆栈中。

参见 here更多信息(和一个 pthread 示例)。

关于c++ - 关于 pthread_exit 释放自动变量的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15700000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com