2015-04-22 47 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端不處理任何併發,所以線程安全並不是那裏的問題。