调用需要来自不同光纤的主线程的函数

时间:2018-10-13 21:15:02

标签: c ruby multithreading ui-thread fibers

应该从主线程调用许多函数。以我有限的经验,这些主要是UI功能。

示例:

假设我有一个光纤库,该库创建具有设置/获取上下文的“线程”。从主OS线程启动的任何光纤中调用仅主线程功能是否安全?

我认为这很好,因为操作系统不了解我的光纤,但是我不确定。我会对此进行测试,但结果不会是确定的,因为它可能有效,但依赖于未定义的行为。

编辑:由于设置/获取上下文是C函数,因此将此问题标记为C,尽管如评论中所述,我认为它也可能适用于用其他语言编写的程序。

1 个答案:

答案 0 :(得分:3)

是的,您可以在任何上下文中调用程序中的任何函数。请注意,使用getcontextsetcontext并不是真正的“线程”,并且您不会对此进行任何并行处理-您只会得到调度。这就是为什么它可以工作的原因,无论它是否是UI函数。基本上,这只是跨功能的goto。直接引用manpage

  

如果上下文是通过调用getcontext()获得的,则程序   执行将继续,就像此调用刚刚返回一样。

这意味着如果我写

... code ... getcontext(&cxt); ... code ... setcontext(&cxt);

然后,当我到达setcontext时,我进入的状态与返回函数getcontext时的状态相同。没有明显的差异(当然,您可能同时更改了内存值,但这并不重要)。手册页与makecontext的保证类似,但请注意,它将在给定函数完成执行后将您重定向。

您提供的示例是高级编程语言,它们具有更高的复杂度,因此不像setcontext中的getcontext / C那样简单。您发布的Java错误似乎实际上是一个独立的OS线程,与第三个示例相同。第一个示例看起来可能是一个伪线程,但是当然存在隐藏的复杂性,这可能会阻止UI调用正常工作(因为它们与外部API交互)。

这就是为什么JS中的线程如此简单的原因:因为线程不是真实的。并行性能的下降使您能够从分派的函数和Ajax调用中的任何地方调用任何东西。

如果您知道光纤库实际上仅使用getcontextsetcontext,那么就可以了。图书馆可能还会做其他事情,因此最好在这种情况下与图书馆作者进行核对。