gpt4 book ai didi

c - 将堆栈变量传递给 pthread_cleanup_push

转载 作者:行者123 更新时间:2023-12-03 20:20:51 26 4
gpt4 key购买 nike

我有一个使用文件描述符的线程并且必须 close()取消时的文件描述符。伪代码如下所示:

static void thread_cleanup(void *args)
{
int *fd = (int *)args;
close(*fd);
}

void *thread(void *arg)
{
int fd = open(...);
...
pthread_cleanup_push(thread_cleanup, &fd);
....
}

我的一种选择是通过 fd转换到 void *来自 thread ,并有 thread_cleanup把它扔回 int ,但如果 sizeof(int) != sizeof(void *),这可能会导致问题.我的问题是:以这种方式使用时,像伪代码一样传递堆栈变量是否安全?

最佳答案

您的关注 sizeof似乎是基于一些困惑。 int之间没有转换和 void *正在发生,因此它们的大小是否相同,或者一个的值是否可以在另一个中表示,都无关紧要。发生的事情是fd的地址,类型为 int * 的指针值, 正在转换为 void *并返回 int * .这是void *的全部意义并且是完全正确的用法。

至于指向的对象是否“在堆栈上”(在推送/弹出清理处理程序的函数中具有自动存储持续时间的对象)是否重要,答案是肯定的,但您的使用是可以的。

形式上(按照 POSIX 中的当前规范编写),任何在取消操作之前生命周期未结束的对象仍然存在,并且可以从所有清理处理程序访问。然而,这似乎是标准中的一个错误,因为它与支持基于展开的实现(如大多数现实世界的实现)的基本原理文档冲突,其中取消清理处理程序在它们被推送的块上下文中执行。自对象int fd;在函数中 thread具有与 pthread_cleanup_push 之外的包含块相关联的生命周期块,从清理处理程序访问它是完全安全的 thread_cleanup .

关于c - 将堆栈变量传递给 pthread_cleanup_push,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466928/

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