我想通过Erlang端口从Erlang进程调用C函数,如下所述:
http://www.erlang.org/doc/tutorial/c_port.html
在生产中,我需要多个Erlang进程并行调用C函数,每个进程都有一组不同的参数。
我的问题是,这是C函数级别的线程安全吗?
文档讨论控制Erlang进程创建“连接进程”,听起来好像负责创建“外部程序”(C函数)的隔离实例。
所以听起来它在C级是线程安全的,但我想100%肯定。
TIA
答案 0 :(得分:0)
这可能取决于您的实施,但对于Ports,答案几乎肯定是"是"因为你提到的原因。如果您使用NIF并在NIF内部使用共享内存,则会对线程安全性有所顾虑。
然而,对于端口,"控制过程"充当序列化(如在一系列中排列的)层,意味着请求一个接一个地处理而不是一次处理。此外,我相信(但不确定)通信协议端口使用也需要这种串行执行。
答案 1 :(得分:0)
端口是使用标准输入输出与Erlang端通信的程序。是否需要线程安全取决于您实现的通信协议。
如果你认为端口是一个erlang进程(erlang方面是你的erlang代码看到的抽象)你可以实现一个协议,无论你发送给它的每个请求,它都会阻塞,直到它发回一个响应,或者您可以并行发送多个请求并异步获取所有请求的响应。
走C方面,前一种情况的实现将是一个简单的循环
并发性在erlang端处理,因为所有传入的命令都将堆叠在端口收件箱中,而端口一次处理一个。
对于后者,你需要一种机制来处理输入消息git remote add origin git@bitbucket.org:samuelrivas/dfberl.git 异步地,为了简单起见,我将在这里使用线程:
主循环:
线程循环:
请注意,在写入stdout时,线程需要某种锁定,我通常将该部分实现为另一个具有异步队列的线程,其中所有其他线程都将结果发布到。
在第二种情况下,您将在C端具有并发性,因此您需要关心线程安全性。在第一个中,C端不处理任何并发性,因此线程安全性不是问题。