2015-04-22 29 views
3

我期待通过一个Erlang端口调用从Erlang进程C函数,如下所述:二郎端口和线程安全

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

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

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

该文档讨论了控制Erlang进程创建'连接进程',它听起来好像负责创建'外部程序'(C函数)的独立实例。

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

TIA

回答

0

这可能取决于您的实现,但随着港口,答案是几乎可以肯定“是”你所提到的原因。如果您在NIF内部使用NIF并使用共享内存,那么您会担心线程安全。

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

0

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

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

去的C面,在前一种情况下的实施将是一个简单的循环做

  1. 从标准
  2. 的过程,命令
  3. 写结果读命令到标准输出
  4. 去1

在erlang方面处理并发性,因为所有传入的命令都会堆积在端口收件箱中而港口一次只能处理一个。

对于后者,您需要一个机制来处理输入消息git remote add origin [email protected]:samuelrivas/dfberl。Git的 异步,我会在这里使用线程简单:

主循环:

  1. 从标准
  2. 产生一个线程来处理读命令它
  3. 去1

线程循环:

  1. process命令
  2. 写结果到标准输出

注意,线程就需要某种形式的锁定写入标准输出的时候,我通常执行的部分与异步的队列,所有的其他线程结果发布另一个线程至。

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