首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么东西可以替代<ucontext.h>函数吗?

有什么东西可以替代<ucontext.h>函数吗?
EN

Stack Overflow用户
提问于 2010-11-29 04:44:58
回答 4查看 8.5K关注 0票数 24

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

有没有标准的替代方案?我觉得成熟的线程并不擅长实现协作式线程。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-29 05:29:38

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

有一个真正的问题,那就是如果没有编译器的主要帮助,就无法将传递到makecontext中的int argc, ...转换为传递给函数的形式,除非变量函数和非变量函数的调用约定恰好是相同的(即使这样,它是否能够可靠地完成也是值得怀疑的)。但是,这个问题本可以通过放弃使用makecontext(ucp, func, 1, (void *)arg);以外的任何形式的makecontext来解决。

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

编辑线程(基于OP的请求):要使用实现“协作式线程”,您需要条件变量。下面是一个不错的pthread教程,里面有关于如何使用它们的信息:

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

您的协作多任务原语“将执行移交给线程X”将类似于:

代码语言:javascript
复制
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作为“进入睡眠”和“唤醒其他线程”的原语。

票数 18
EN

Stack Overflow用户

发布于 2012-04-06 01:03:11

无论它的价值是什么,有一个Boost.Context库是recently accepted的,只需要合并到官方的Boost版本中。Boost.Context解决了与POSIX ucontext家族相同的用例:低开销的协作上下文切换。作者在性能问题上花了不少心思。

票数 10
EN

Stack Overflow用户

发布于 2010-11-29 05:06:49

不,它们没有标准的替代品。

您的选项是

  • 继续使用<ucontext.h>,即使它们包含过时C。
  • 切换到pthreads线程
  • 编写您自己的协线程库
  • 使用现有的(并且可能不是很容易移植的)协线程库,尽管许多这样的库是在ucontext.h H210上实现的
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4298986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档