有什么东西可以替换函数吗?

不推荐使用中的用户线程函数,因为它们使用了不推荐使用的Cfunction(它们使用带有空括号的函数声明作为参数 )。

它们有标准替代品吗? 我不认为成熟的线程擅长实现协作线程。

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

有一个真正的问题,如果没有编译器的主要帮助,将int argc, ...传递给makecontext转换为传递给函数的表单是不可能的,除非变量和非变量函数的调用约定碰巧是同样的(即使这样,它是否能够稳健地完成也是相当可疑的)。 然而,这个问题可以简单地通过弃用makecontext的任何forms使用makecontext来解决makecontext(ucp, func, 1, (void *)arg);

或许更好的问题是为什么你认为ucontext.h函数是处理线程的最佳方法。 如果您确实想要使用它们,我可能会建议编写一个包装器接口,您可以使用ucontext.h pthreads实现,然后比较性能和膨胀。 这也有一个好处,如果将来的系统放弃对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作为“去睡觉”和“唤醒其他线程”原语。

对于它的价值,有一个最近被接受的Boost.Context库,只需要合并到官方的Boost版本中。 Boost.Context解决了与POSIX ucontext系列相同的用例:低开销协作上下文切换。 作者对性能问题付出了沉重的代价。

不,没有标准替代品。

你有选择

  • 继续使用即使它们包含过时的C.
  • 切换到pthreads
  • 编写自己的共同线程库
  • 使用现有的(可能不那么便携的)共同线程库,例如http://swtch.com/libtask/ ,尽管许多这样的库是在ucontext.h之上实现的。

Open Group Base Specifications Issue 6 IEEE Std 1003.1,2004 Edition

仍然使用相同的弃用语法列出makecontext()和swapcontext()。 我最近没见过什么。