我有一个使用文件描述符的线程并且必须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 *
from thread
,并且有thread_cleanup
将其投射回int
,但这可能会导致问题,如果sizeof(int) != sizeof(void *)
。我的问题是:以这种方式使用时,像伪代码中那样传递堆栈变量是否安全?
您关心的sizeof
似乎是基于一些混乱。之间没有转换int
and void *
正在发生,因此它们的大小是否相同,或者一个值是否可以用另一个值表示,都是无关紧要的。发生的事情是地址fd
, 类型的指针值int *
,正在转换为void *
然后回到int *
。这就是整个要点void *
并且是完全正确的用法。
至于所指向的对象是否“在堆栈上”(在清理处理程序被推入/弹出的函数中具有自动存储持续时间的对象)是否重要,答案是肯定的,但您的用法是可以的。
形式上(按照 POSIX 中当前规范的编写),在取消操作之前其生命周期未结束的任何对象仍然存在,并且可以从所有清理处理程序访问。然而,这似乎是标准中的一个错误,因为它与支持基于展开的实现(如大多数现实世界的实现)的基本原理文档相冲突,其中取消清理处理程序在它们被推送的块上下文中执行。既然对象int fd;
在函数中thread
具有与外部包含块相关联的生命周期pthread_cleanup_push
块,从清理处理程序访问它是完全安全的thread_cleanup
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)