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

时间:2015-11-19 19:29:19

标签: c++ c linux multithreading sockets

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

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

  • 此套接字上的一个接收器线程
  • 很少可以调用' send()'在这个插座上。

我的问题是 - 是AF_UNIX socket' send()'线程安全?如果我在AF_UNIX套接字fd上并行/同时调用send,那么内核会处理同步吗?

我经历了多个链接,但都与TCP / UDP(AF_INET)套接字有关,所以如果有人可以建议一个证明答案合理的链接,或者可以提供对内核代码的一些了解,那将会有很大帮助

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

通常,读取或写入等操作都是原子操作。但是在管道或插座上的东西是不同的。

对于管道,POSIX,但我怀疑Linux在这一点上是合规的,并指出只有当length小于PIPE_BUF时才保证并发写入不会被交错。请参阅POSIX write

对于套接字send家庭功能的Linux手册说:

  

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

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

此主题Is send atomic?提供了答案。