<ucontext.h>
中的用户线程函数已弃用,因为它们使用已弃用的C功能(它们为use a function declaration with empty parentheses for an argument)。有什么可以取代<ucontext.h>的功能吗?
是否有标准的替代品?我不觉得完整的线程擅长实现协作式线程。
<ucontext.h>
中的用户线程函数已弃用,因为它们使用已弃用的C功能(它们为use a function declaration with empty parentheses for an argument)。有什么可以取代<ucontext.h>的功能吗?
是否有标准的替代品?我不觉得完整的线程擅长实现协作式线程。
如果你真的想做一些像ucontext.h
函数允许的东西,我会继续使用它们。其他任何东西都不会轻便。在POSIX中标记它们过时似乎是委员会某人的一段可怕的犯罪错误。 POSIX本身要求函数指针和数据指针的大小相同,并且要表示的函数指针可以表示为void *
,而C本身需要在函数指针类型之间进行转换并返回为往返安全,所以这个问题有很多方法本来可以解决的。
还有一个现实的问题,即转换int argc, ...
传递到makecontext
成的形式传递给函数不能没有重大援助编译器来完成,除非可变参数和非参数可变型函数的调用约定恰好是相同的(即便如此,它是否可以做得很好也是个疑问)。然而,这个问题可以通过简单地使用除makecontext(ucp, func, 1, (void *)arg);
以外的任何形式的makecontext
来解决。
也许一个更好的问题是,为什么你认为ucontext.h
函数是处理线程的最好方法。如果你确实想和他们一起去,我可能会建议你写一个包装界面,你可以用或者与ucontext.h
或与pthreads,然后比较性能和膨胀。这也有一个好处,就是如果未来的系统不支持ucontext.h
,你可以简单地切换到基于pthread的实现编译,一切都将简单地工作。 (届时,膨胀可能是不太重要的,多核的好处/ SMP将可能是巨大的,并希望并行线程的实现会越来越臃肿。)
编辑(基于OP的要求):为贯彻落实用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_wait
和pthread_cond_signal
作为“去睡觉”和“唤醒其他线程”原语。
不,没有标准的替代品。
你选择是
<ucontext.h>
即使它们包含过时C.Open Group基本规格第6期 IEEE Std 1003.1,2004版
仍然列出makecontext()和swapcontext()具有相同的不赞成使用的语法。我还没有看到任何更近的。
对于它的价值,有一个Boost.Context
库是recently accepted,只需要合并到一个官方的Boost版本。 Boost.Context
解决了与POSIX ucontext
系列相同的用例:低开销合作上下文切换。作者为性能问题付出了沉重的代价。
我不知道如果这些不那么便携库可以被移植到使用并行线程,而不是OS /机专用黑客,类似于我的答案的方法... – 2010-11-28 22:55:12
可能,但是这是一个很多重量级的。 – nos 2010-11-29 08:39:23
我不会说“很多”。上下文切换的几千个周期(或者更少的SMP /多内核),以及每个线程几十kb的额外数量(我猜在内核空间中会有2-4个页面,而在用户空间中会有相同的数量)。 – 2010-12-03 00:17:24