【问题标题】:Erlang ports and thread safetyErlang 端口和线程安全
【发布时间】:2015-06-30 10:04:38
【问题描述】:

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

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

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

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

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

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

TIA

【问题讨论】:

    标签: erlang erlang-ports


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      端口是使用标准输入输出与 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 端不处理任何并发,因此线程安全不是问题。

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多