2015-11-19 34 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?