问题描述
UNIX SOCK_DGRAM 套接字对于 recv() 方法是线程安全的吗?
如果多个线程在 socket 上调用 recv(),保证每个线程都能得到一个干净的 UDP 数据包,还是有可能数据混淆?
socket是阻塞模式还是非阻塞模式会影响行为吗?任何指向文档的指针将不胜感激。
解决方法
从多个线程调用 recv()
是一种安全操作。如果套接字是数据报套接字,则每个 recv 返回一个唯一的数据报,不会与其他数据报混淆。
Posix 标准明确列举了所有不安全的标准函数:
2.9.1 线程安全
本 POSIX.1-2017 卷定义的所有函数均应为 线程安全,除了以下功能1不需要 线程安全。
asctime() basename() catgets() crypt() ctime() ....
有近 100 个不安全的函数和仅在特定条件下安全的其他函数。 recv()
不在那里。见POSIX.1-2017 2.9.1 Thread-Safety。