2015-11-19 38 views
3

四處查看,但無法找到任何證明AF_UNIX套接字的答案的鏈接。AF_UNIX套接字是否發送線程安全?

我的實現是在Linux系統上,我有一個AF_UNIX SOCK_STREAM套接字,此套接字上此套接字

  • 少數工作線程可以稱之爲「發送()」

    • 一個接收器線程。

    我的問題是 - 是AF_UNIX套接字'send()'線程安全嗎?如果我有在AF_UNIX套接字fd上並行/同時調用發送的線程,內核是否負責同步?

    我經歷了多個鏈接,但都與TCP/UDP(AF_INET)套接字有關,所以如果任何人都可以建議一個鏈接來證明答案的正確性,或者可以提供一些洞察內核代碼,那將是很大的幫助。

  • +0

    這與線程無關。 – curiousguy

    回答

    5

    POSIX specifies它定義的所有函數必須是線程安全的,除了特定例外列表中的函數外。 send(2)函數由POSIX定義,不包含在例外列表中。由於send(2)的Linux實現聲明符合POSIX規範,因此可以依賴它來保證線程安全。

    +2

    據我所知,「Linux」不是「POSIX兼容系統」。 – 2015-11-19 19:40:07

    +1

    @Rhymoid,'send()'是一個系統調用,它的Linux實現被記錄爲符合POSIX。我已經更新了我的答案,在這方面更加精確。 –

    +0

    是的,但「線程安全」是什麼意思? – curiousguy

    1

    一般來說,像讀或寫操作是原子操作。但是在管道或插座上的事情是不同的。

    對於,POSIX,但我懷疑的Linux是在這一點上兼容,指出併發寫入保證不會只有長度小於PIPE_BUF交錯。見POSIX write

    對於插座,Linux的手冊send家庭功能說:

    當消息不適合插入插座的發送緩衝區, 的send()通常塊,除非該插座已被放置在 非阻塞I/O模式。

    這表明,內核可能send是你的消息成片,就像管語義。

    在這個問題上有一個提供的答案Is send atomic?