AF_UNIX套接字发送是否线程安全?

4
看了一圈,没找到任何关于AF_UNIX socket答案的链接。
我的实现在Linux系统上,我有一个AF_UNIX SOCK_STREAM socket,
  • 一个接收器线程在这个socket上
  • 几个worker线程可以在这个socket上调用'send()'
我的问题是 - AF_UNIX socket 'send()' 是线程安全的吗?如果我有多个线程同时在AF_UNIX socket fd上调用send,内核会处理同步吗? 我查阅了多个链接,但都与TCP/UDP(AF_INET)socket有关。所以,如果有人能够提供一个证明答案或者提供一些内核代码方面的见解,那将非常有帮助。

这与线程无关。 - curiousguy
2个回答

6

POSIX规定,它所定义的所有函数必须是线程安全的,除了在特定例外清单中的函数。函数send(2)是由POSIX定义的,并未包含在例外清单中。鉴于Linux对send(2)的实现声称符合POSIX规范,您可以放心使用它并保证线程安全。


2
据我所知,“Linux”不是一个“符合POSIX标准的系统”。 - user824425
1
@Rhymoid,“send()”是一个系统调用,它在Linux实现中符合POSIX标准。我已经更新了我的答案,以便更加精确地描述这一点。 - John Bollinger
是的,但是“线程安全”是什么意思? - curiousguy
@curiousguy,就POSIX而言,函数是线程安全的意思是,如果该函数被两个不同的线程并发调用,则每个调用的行为都符合该函数的规范。 - John Bollinger

1
一般来说,像读或写这样的操作是原子性的。但在管道或套接字上,情况就不同了。
对于管道,POSIX(但我怀疑Linux在这一点上也是兼容的)规定,仅当长度小于PIPE_BUF时,并发写入才保证不会交错。请参见POSIX write
对于套接字,Linux的send系列函数手册中提到:

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

这表明内核可能会像使用管道语义一样将您的消息分成几部分发送。
关于此主题存在一个提供的答案Is send atomic?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接