2

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

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

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

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

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

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

TIA

4

2 回答 2

0

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

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

于 2015-04-22T16:05:31.797 回答
0

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

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

在 C 端,前一种情况的实现将是一个简单的循环

  1. 从标准输入读取命令
  2. 处理该命令
  3. 将结果写入标准输出
  4. 去 1

并发在 erlang 端处理,因为所有传入的命令将堆积在端口收件箱中,而端口一次处理一个。

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

主循环:

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

线程循环:

  1. 进程命令
  2. 将结果写入标准输出

请注意,线程在写入标准输出时需要某种锁定,我通常将该部分实现为另一个带有异步队列的线程,所有其他线程都将结果发布到该队列。

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

于 2015-07-11T07:51:55.553 回答