【问题标题】:Erlang NIFs: Threads lockingErlang NIF:线程锁定
【发布时间】:2015-01-02 14:02:25
【问题描述】:

NIF 实现可以使用常规 C/C++ 线程锁定原语还是必须使用 NIF API(enif_mutex_lock(..), enif_mutex_create(..), 等)

【问题讨论】:

  • 如果对您有帮助,enif_mutex_lock() 的实现方式如下:github.com/erlang/otp/blob/…。看起来线程被标记为被阻止。
  • 尝试先写一个端口——大多数时候你实际上并不需要一个NIF。如果您必须编写 NIF(这应该是最后的手段),请使用 NIF API。或者期望你的整个虚拟机因为你太聪明而变得不稳定。
  • @zxq9 来自官方文档:“NIF 比使用端口驱动程序更简单、更有效地调用 C 代码。”
  • @GabiMe 确实如此。但是,一旦您开始谈论互斥锁和锁之类的东西,您就完全否定了第二位的目的:“ NIF 最适合示例中的 foo 和 bar 之类的同步函数,它可以进行一些相对较短的计算而没有副作用,并且返回结果。”如果这种情况成立,您无需担心锁定任何东西,而是需要使用端口。嗯...无论哪种方式,这都是一次学习经历。

标签: c erlang erlang-nif


【解决方案1】:

来自nif docs

线程和并发

NIF 是线程安全的,无需任何显式同步,只要它充当纯函数并且只读取提供的参数。一旦您通过静态变量或 enif_priv_data 写入共享状态,您就需要提供自己的显式同步。这包括在线程之间共享的进程独立环境中的术语。如果您将资源对象视为可变对象,它们也需要同步。

所以没有什么可以阻止你做任何你想做的事。您可以轻松地编写自己的互斥体/信号和什么不。你可以用 C 或 C++ 或 Rust 来做。

也就是说,没有什么可以阻止一切。如果你破坏任何东西,你就会在整个虚拟机中破坏它。我会尝试使用标准的 Erlang 做事方式,尤其是在处理线程时。这些是经过验证的方法,我还没有找到任何理由用其他方法替换它们。

【讨论】:

  • 好的,但是为什么 Erlang 会首先提供锁定 API?使用它代替常规锁定有什么好处吗?
  • 与 C++ 提供列表和向量的原因相同,因此您不会重新实现它们,但存在潜在的错误。 Erlangs 锁/互斥锁中有一些额外的调试信息。除此之外还有正常工作的锁(因为不规则的锁不起作用,而且没有 SuperLocks 之类的东西 :))。除此之外,我同意@zxq9 cmets,如果您想知道应该使用什么,请使用端口,并且仅在您证明不足时才考虑NIF。
猜你喜欢
  • 2011-03-25
  • 2020-12-12
  • 2016-10-06
  • 2012-01-07
  • 2016-03-30
  • 1970-01-01
  • 2020-05-17
  • 2016-09-01
  • 2013-01-03
相关资源
最近更新 更多