会发生什么,如果我有一个插座, s, 没有当前可用的数据,这是一个阻止插座,和我通话 recv 关于它从两个线程的一次?将一个线程获得数据?都将得到它?将2号呼叫 recv 带回一个错误?

有帮助吗?

解决方案

一个线程将得到它,并且没办法告诉其中。

这看起来不像一个合理的设计。是有一个理由为什么你需要两个线呼叫 recv() 在同一座?

其他提示

套接字实现应该是线程安全的,所以只有一个线程应该得到的数据时可用。另一个呼叫应该只是阻塞。

我找不到这样的参考,但这里是我的理解:

线程安全可能仅仅意味着多个线程可以分别安全地使用他们的自己插座供应商的保证;它并不能保证的原子在单个呼叫,而它并不保证在多个线程之间套接字的数据的任何特定配置。

假设线程A调用的recv()这是接收TCP数据以高速率流中的插座上。如果的recv()需要一个原子调用,那么线程A可以阻止所有其他线程执行的,因为它需要连续运行中的所有数据拉(直到缓冲区满,反正)。这将不会是好。因此,我不会假定的recv()是免疫上下文切换。

相反,假设线程A使一个的阻断拨打到的recv()上的TCP套接字,并且该数据被慢慢英寸因此,调用的recv(),并将errno设置为EAGAIN返回。

在这两种情况下,假设线程B调用的recv()在同一插座上,而线程A仍在接收数据。什么时候线程A停止获取交给它,这样线程B可以开始接收数据的数据?我不知道一个Unix的实现,会尽量记得,线程A是在插座上的操作的中间;相反,它是由应用程序(线程A和B)以协商它们的使用。

一般地,这是最好的设计应用程序,以便只有一个线程将在单个插座调用的recv()。

scroll top