Erlang端口和线程安全

时间:2015-04-22 15:52:28

标签: erlang erlang-ports

我想通过Erlang端口从Erlang进程调用C函数,如下所述:

http://www.erlang.org/doc/tutorial/c_port.html

在生产中,我需要多个Erlang进程并行调用C函数,每个进程都有一组不同的参数。

我的问题是,这是C函数级别的线程安全吗?

文档讨论控制Erlang进程创建“连接进程”,听起来好像负责创建“外部程序”(C函数)的隔离实例。

所以听起来它在C级是线程安全的,但我想100%肯定。

TIA

2 个答案:

答案 0 :(得分:0)

这可能取决于您的实施,但对于Ports,答案几乎肯定是"是"因为你提到的原因。如果您使用NIF并在NIF内部使用共享内存,则会对线程安全性有所顾虑。

然而,对于端口,"控制过程"充当序列化(如在一系列中排列的)层,意味着请求一个接一个地处理而不是一次处理。此外,我相信(但不确定)通信协议端口使用也需要这种串行执行。

答案 1 :(得分:0)

端口是使用标准输入输出与Erlang端通信的程序。是否需要线程安全取决于您实现的通信协议。

如果你认为端口是一个erlang进程(erlang方面是你的erlang代码看到的抽象)你可以实现一个协议,无论你发送给它的每个请求,它都会阻塞,直到它发回一个响应,或者您可以并行发送多个请求并异步获取所有请求的响应。

走C方面,前一种情况的实现将是一个简单的循环

  1. 从stdin读取命令
  2. 处理该命令
  3. 将结果写入stdout
  4. 转到1
  5. 并发性在erlang端处理,因为所有传入的命令都将堆叠在端口收件箱中,而端口一次处理一个。

    对于后者,你需要一种机制来处理输入消息git remote add origin git@bitbucket.org:samuelrivas/dfberl.git 异步地,为了简单起见,我将在这里使用线程:

    主循环:

    1. 从stdin读取命令
    2. 产生一个线程来处理它
    3. 转到1
    4. 线程循环:

      1. 处理命令
      2. 将结果写入stdout
      3. 请注意,在写入stdout时,线程需要某种锁定,我通常将该部分实现为另一个具有异步队列的线程,其中所有其他线程都将结果发布到。

        在第二种情况下,您将在C端具有并发性,因此您需要关心线程安全性。在第一个中,C端不处理任何并发性,因此线程安全性不是问题。