这个问题在这里已有答案:
环顾四周,但找不到任何证明AF_UNIX套接字答案的链接 .
我的实现是在linux系统上,我有一个AF_UNIX SOCK_STREAM套接字,
-
此套接字上有一个接收器线程
-
几个可以在此套接字上调用'send()'的工作线程 .
我的问题是 - are AF_UNIX socket 'send()' thread safe? If I have threads parallely/concurrently calling send on the AF_UNIX socket fd, will kernel take care of the synchronization?
我经历了多个链接,但都与TCP / UDP(AF_INET)套接字有关,所以如果有人可以建议一个证明答案合理的链接,或者可以提供对内核代码的一些了解,那将会有很大的帮助 .
2 回答
POSIX specifies它定义的所有函数必须是线程安全的,除了特定异常列表中的那些函数 .
send(2)
函数由POSIX定义,不包含在异常列表中 . 由于send(2)
的Linux实现声称符合POSIX规范,因此您可以依赖它来保证线程安全 .通常,读取或写入等操作都是原子操作 . 但是在管道或插座上的东西是不同的 .
对于 pipes ,POSIX,但我怀疑Linux在这一点上是合规的,声明只有当长度小于
PIPE_BUF
时才保证并发写入不被交错 . 见POSIX write .对于 sockets ,
send
系列函数的Linux手册说:这表明内核可能会将您的消息分成几部分,就像管道语义一样 .
关于这个问题,我们提供了答案Is send atomic? .