gpt4 book ai didi

c - 有什么东西可以代替 函数吗?

转载 作者:太空狗 更新时间:2023-10-29 16:25:58 27 4
gpt4 key购买 nike

<ucontext.h> 中的用户线程函数已弃用,因为它们使用了已弃用的 C 功能(它们 use a function declaration with empty parentheses for an argument )。

是否有标准的替代品?我觉得成熟的线程不擅长实现协作线程。

最佳答案

如果您真的想做 ucontext.h 函数允许的事情,我会继续使用它们。其他任何东西都不那么便携。在 POSIX 中将它们标记为过时似乎是委员会中某人犯下的一个可怕的迂腐错误。 POSIX 本身要求函数指针和数据指针的大小相同,并且函数指针可表示为 void *,而 C 本身要求在函数指针类型之间进行转换并返回是往返安全的, 所以有很多方法可以解决这个问题。

有一个真正的问题,将传递给 makecontextint argc, ... 转换成一种形式传递给函数,如果没有来自编译器,除非可变函数和非可变函数的调用约定恰好相同(即便如此,它是否可以稳健地完成也是相当值得怀疑的)。然而,这个问题本来可以简单地通过以 makecontext(ucp, func, 1, (void *)arg); 以外的任何形式弃用 makecontext 来解决。

也许更好的问题是为什么您认为 ucontext.h 函数是处理线程的最佳方式。如果您确实想使用它们,我可能建议编写一个包装器接口(interface),您可以使用 ucontext.h 使用 pthreads 实现或者,然后比较性能和膨胀。这还有一个好处,如果 future 的系统不再支持 ucontext.h,您可以简单地切换到使用基于 pthread 的实现进行编译,一切都会简单地工作。 (到那时,膨胀可能不那么重要,多核/SMP 的好处可能会很大,希望 pthread 实现不会那么膨胀。)

编辑(根据 OP 的要求):要使用 pthreads 实现“协作线程”,您需要条件变量。这是一个不错的 pthreads 教程,其中包含有关使用它们的信息:

https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

“将执行移交给线程 X”的协作式多任务原语将如下所示:

self->flag = 0;
other_thread->flag = 1;
pthread_mutex_lock(other_thread->mutex);
pthread_cond_signal(other_thread->cond);
pthread_mutex_unlock(other_thread->mutex);
pthread_mutex_lock(self->mutex);
while (!self->flag)
pthread_cond_wait(self->cond, self->mutex);
pthread_mutex_unlock(self->mutex);

希望我没搞错;至少总体思路是正确的。如果有人看到错误,请发表评论,以便我进行修复。一半的锁定(other_thread 的互斥锁)对于这种用法可能是完全不必要的,因此您可以将互斥锁设为 task_switch 函数中的局部变量。您真正要做的就是使用 pthread_cond_waitpthread_cond_signal 作为“进入休眠”和“唤醒其他线程”原语。

关于c - 有什么东西可以代替 <ucontext.h> 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298986/

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