<ucontext.h>中的用户线程函数已被弃用,因为它们使用了已弃用的C特性(它们是use a function declaration with empty parentheses for an argument)。
有没有标准的替代方案?我觉得成熟的线程并不擅长实现协作式线程。
发布于 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”将类似于:
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_wait和pthread_cond_signal作为“进入睡眠”和“唤醒其他线程”的原语。
发布于 2012-04-06 01:03:11
无论它的价值是什么,有一个Boost.Context库是recently accepted的,只需要合并到官方的Boost版本中。Boost.Context解决了与POSIX ucontext家族相同的用例:低开销的协作上下文切换。作者在性能问题上花了不少心思。
发布于 2010-11-29 05:06:49
不,它们没有标准的替代品。
您的选项是
<ucontext.h>,即使它们包含过时C。https://stackoverflow.com/questions/4298986
复制相似问题