是否安全发出阻塞的write()从多个线程在同一TCP套接字上调用?(Is it safe to i

2019-07-18 22:03发布

比方说,我有两个线程,T1和T2。

线程T1使上的TCP插座S的阻挡write()调用要发送的字节B1的大的缓冲器。 字节B1的缓冲器是如此之大,(a)所述写入呼叫块和(b)TCP具有使用多个分段发送缓冲区。

线程T2也使得在相同的TCP插座S的阻挡write()调用要发送的字节B2的一些其它大的缓冲器。

我的问题是这样的:

请问TCP的UNIX上保证执行的是B1的所有字节将B2(反之亦然)的所有字节之前发送?

或者是有可能的是TCP交织的B1和B2的内容(例如TCP发送一个段与B1的数据,则一个与B2的数据段,一个则用B1数据再次段)。

PS - 我知道这是不是一个好主意来做到这一点。 我试图确定一些代码,我没有写是否是正确的。

Answer 1:

它会尝试

TL; DR:编写和调试代码的目的,它是安全的假设原子,除非你的目标是在生命支持系统。


它总是将是坏的,如果一个send(2)write(2)上的TCP套接字不是原子。 从未有实现非原子写一个很好的理由。 Unix和Windows尝试的所有版本,以保持写入原子,但显然很少提供了保证。

Linux是已知的“通常” 1获得这项权利,但它有一个错误,甚至在最近的内核。 它尝试锁定插槽,但在某些情况下内存分配可能会失败,并写入会被分拆。 请参见上SENDMSG这个IBM博客条目的详细信息。 [链接固定。]

根据这些测试,仅适用于AIX和Solaris完全通过一个线程压力测试。 如果连这些系统有根本没有发现故障的情况下它不知道。


1. TL; DR:几乎总是,即,总是除了在一定的误差的存在。



文章来源: Is it safe to issue blocking write() calls on the same TCP socket from multiple threads?