AF_UNIX套接字发送线程安全吗

Is AF_UNIX socket send thread safe?

本文关键字:线程 安全 UNIX 套接字 AF      更新时间:2023-10-16

环顾四周,但找不到任何链接来证明AF_UNIX套接字的答案。

我的实现是在linux系统上实现的,我有一个AF_UNIX SOCK_STREAM套接字,

  • 这个插座上有一个接收器螺纹
  • 很少有工作线程可以在此套接字上调用"send()"

我的问题是-AF_UNIX套接字"send()"线程安全吗?如果我在AF_UNIX套接字fd上有并行/并发调用send的线程,内核会负责同步吗

我浏览了多个链接,但所有链接都与TCP/UDP(AF_INET)套接字有关,因此,如果有人能提出一个证明答案正确的链接,或者能深入了解内核代码,那将是非常有帮助的。

POSIX指定它定义的所有函数都必须是线程安全的,除了特定异常列表中的函数。send(2)函数由POSIX定义,不包括在异常列表中。由于send(2)的Linux实现声称符合POSIX规范,因此可以依赖它来实现线程安全。

通常,读或写等操作都是原子操作。但在管道或插座上,情况就不同了。

对于管道,POSIX(但我怀疑Linux在这一点上是兼容的)指出,只有当长度小于PIPE_BUF时,才能保证并发写入不会交错。请参阅POSIX写入。

对于套接字send系列函数的Linux手册中写道:

当消息不适合于套接字的发送缓冲器时,send()通常会阻塞,除非套接字已放置在非阻塞I/O模式。

这表明内核可能send将您的消息分解为多个部分,就像管道语义一样。

关于这个问题,有一个提供的答案是发送原子?。