- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用文件描述符的线程并且必须 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/
我有一个使用文件描述符的线程并且必须 close()取消时的文件描述符。伪代码如下所示: static void thread_cleanup(void *args) { int *fd =
我想知道如何将成员函数传递给pthread_clean_push。我不想将清理函数声明为静态函数并将对象的引用传递给它。下面是场景 class Foo{ public: Foo(string n
我尝试在我的代码中添加一个部分,该部分能够在取消的情况下解锁互斥量。这可能会发生并会导致死锁。因此,我尝试添加 pthread_cleanup_push(cleanup_unlock_mutex, &
我在 C 中有以下代码: pthread_cleanup_push(pthread_mutex_unlock, &mutex); 但是当我编译它时,我收到以下警告: warning: initiali
当我尝试将函数 cleanup_thread() 传递给 pthread_cleanup_push() 时: pthread_cleanup_push(cleanup_thread, arg); 我收
在使用 pthread_cleanup_push/pop 和 -O2 CFLAGS 编译一段代码时,我收到一些警告。只需删除 Makefile 中的 O2 cflags 即可顺利编译。 是否禁止对这些
我有一个类似的代码: myThread() { pthread_cleanup_push(CleanupHandler , NULL) while (true) {
我在Advanced Programming in the UNIX Environment (3rd Edition)中读到了这一点,11.5,线程终止: If we run the same pr
Ubuntu Linux 9.04 下的 gcc 版本 4.3.3 以防相关。 这是有问题的代码: pthread_cleanup_push(ctl_cleanup, NULL); ctl_clean
我是一名优秀的程序员,十分优秀!