【发布时间】:2010-11-30 05:53:33
【问题描述】:
假设我有两个线程,T1 和 T2。
线程 T1 在 TCP 套接字 S 上进行阻塞式 write() 调用,以发送字节 B1 的大缓冲区。字节 B1 的缓冲区非常大,以至于 (a) 写调用阻塞和 (b) TCP 必须使用多个段来发送缓冲区。
线程 T2 还在同一个 TCP 套接字 S 上进行阻塞式 write() 调用,以发送一些其他大的字节 B2 缓冲区。
我的问题是这样的:
在 UNIX 上实现 TCP 是否保证 B1 的所有字节将在 B2 的所有字节之前发送(反之亦然)?
或者 TCP 是否有可能交错 B1 和 B2 的内容(例如 TCP 发送一个带有 B1 数据的段,然后是一个带有 B2 数据的段,然后又是一个带有 B1 数据的段)。
PS - 我知道这样做不是一个好主意。我正在尝试确定某些我没有编写的代码是否正确。
【问题讨论】:
-
我们在谈论什么操作系统?
-
Linux。 (如果其他版本的 Unix 的答案不同,我会很感兴趣,例如 OpenBSD 或 OS X)。
-
我不知道 'Nix 系统,但是在 Windows 上,TCP 将两个写操作交织在一起,需要在代码中加锁以防止同时多线程访问套接字以防止重叠。
-
我想你已经回答了你自己的问题。无论目标平台是否存在系统调用原子性错误,这都是一种糟糕的做法。
标签: linux sockets multithreading tcp