什么时候使用Spawn和Spawn_link?

希拉·塔库尔

当我需要创建一个流程时,我将使用常规的spawn bif。但是还有一个bif spawn_link通常用于执行相同的操作。

那么基本上什么时候应该使用spawnspawn_link

zxq9

先执行spawn然后link手动操作等效于spawn_link,但时间上并不等效;特别是它不是原子的(例如,两个独立的操作,不是一个不可分割的操作)。如果您生成一个进程,并且该进程在其初始化中死亡(无论您的startinit函数所做的是什么),那么它可能调用link完成之前就死亡,并且链接的进程将永远不会收到通知,因为该进程在链接之前就已经死亡。糟糕!

摘自乔·阿姆斯特朗(Joe Armstrong)的《编程语言》(Erlang)第13章“为什么生成和链接必须是原子操作”:

很久以前,Erlang有两个原语spawnlink,并且这样spawn_link(Mod, Func, Args)定义:

spawn_link(Mod, Func, Args) ->
    Pid = spawn(Mod, Func, Args),
    link(Pid),
    Pid.

然后发生了一个模糊的错误。生成的进程在调用link语句之前就已终止,因此该进程终止了,但是未生成任何错误信号。这个错误花了很长时间才找到。为了解决这个问题,它spawn_link被添加为原子操作。当涉及到并发时,即使外观简单的程序也可能很棘手。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么时候应该使用std :: thread :: Builder而不是std :: thread :: spawn?

什么时候使用MyISAM和InnoDB?

什么时候使用.val()和.innerHTML?

什么时候使用mapParitions和mapPartitionsWithIndex?

什么时候使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?

什么时候使用.jar和.exe?

count ++和++ count,什么时候使用?

什么时候在postgreSQL中使用=和:=?

什么时候使用[value]和/或[ngValue]?

什么时候应该使用<或<()或<<和>或>()?

什么时候应该使用ParseForm,什么时候应该使用FormValue和PostFormValue?

我什么时候应该使用sed和什么时候应该使用awk

虚拟内存和MMU:什么时候使用,什么时候不使用?

什么时候使用Class.isInstance()和什么时候使用instanceof运算符?

什么时候应该使用require()和什么时候使用define()?

什么时候使用ReaderWriterLockSlim和什么时候使用ConcurrentBag?

什么时候使用.loc和什么时候不使用(Pandas Dataframe)?

在 JSX 事件处理函数参考中什么时候和什么时候不使用“this”?

什么时候使用Requirejs和何时使用捆绑的javascript?

什么时候使用JSP,什么时候使用Servlet?

什么时候使用POST?什么时候使用GET?

什么时候使用 which()?

什么时候使用BufferedInputStream?

什么时候使用嵌入?

什么时候使用zswap?

什么时候使用super()?

什么时候使用typealias?

什么时候使用 ngsanitize?

什么时候使用plist?