首页 文章

AF_UNIX套接字是否发送线程安全? [重复]

提问于
浏览
4

这个问题在这里已有答案:

环顾四周,但找不到任何证明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 回答

  • 1

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

  • 6

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

    对于 pipes ,POSIX,但我怀疑Linux在这一点上是合规的,声明只有当长度小于 PIPE_BUF 时才保证并发写入不被交错 . 见POSIX write .

    对于 socketssend 系列函数的Linux手册说:

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

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

    关于这个问题,我们提供了答案Is send atomic? .

相关问题