两个线程试图同时写入同一tcp套接字时出现同步问题LU

两个线程试图同时写入同一tcp套接字时出现同步问题LU,c,windows,sockets,tcp,network-programming,C,Windows,Sockets,Tcp,Network Programming,我有20个线程,每次都在单个tcp套接字上发送数据,同时也接收数据。当我运行我的应用程序时,我没有看到任何同步问题,但根据我的理解,当两个线程同时尝试写入tcp套接字时,或者当一个线程正在写入而另一个线程正在读取时,可能会出现一些问题 如果我的理解是正确的,为什么我不面对任何错误呢?有时候,当你在过马路之前不看两边时,你仍然可以安全地到达街道的另一边。这并不意味着每次你这么做都会成功 事情是这样的,你说“你看不到任何同步问题”,但那只是因为它碰巧做了你想要它做的事情。反过来说——您没有看到任何同

我有20个线程,每次都在单个tcp套接字上发送数据,同时也接收数据。当我运行我的应用程序时,我没有看到任何同步问题,但根据我的理解,当两个线程同时尝试写入tcp套接字时,或者当一个线程正在写入而另一个线程正在读取时,可能会出现一些问题


如果我的理解是正确的,为什么我不面对任何错误呢?

有时候,当你在过马路之前不看两边时,你仍然可以安全地到达街道的另一边。这并不意味着每次你这么做都会成功

事情是这样的,你说“你看不到任何同步问题”,但那只是因为它碰巧做了你想要它做的事情。反过来说——您没有看到任何同步问题的原因是您碰巧希望它执行它碰巧执行的操作。如果有人希望它做些别的事情,他会发现同样的代码存在同步问题


换句话说,你掷的硬币可能是正面的,也可能是反面的。你知道这并不能保证,所以你希望它能提前出现。然后就出现了。这并不神秘——原因是你预料到它会发生什么。如果你期待其他的事情,即使它做了同样的事情,它也不会做你期望的事情。

有时当你在过马路前没有朝两边看时,你仍然可以安全地到达街道的另一边。这并不意味着每次你这么做都会成功

事情是这样的,你说“你看不到任何同步问题”,但那只是因为它碰巧做了你想要它做的事情。反过来说——您没有看到任何同步问题的原因是您碰巧希望它执行它碰巧执行的操作。如果有人希望它做些别的事情,他会发现同样的代码存在同步问题


换句话说,你掷的硬币可能是正面的,也可能是反面的。你知道这并不能保证,所以你希望它能提前出现。然后就出现了。这并不神秘——原因是你预料到它会发生什么。如果您期望其他东西,即使它做了完全相同的事情,它也不会做您期望的事情。

首先,每个套接字的发送和接收流是独立的。当一个线程发送另一个线程接收时,应该没有问题

如果多个线程试图写入一个套接字,那么行为通常是未定义的。实际上,来自其中一个线程的写调用将首先进入TCP堆栈状态机中的锁,从而阻止任何其他线程进入、写入其数据、释放锁并退出堆栈,从而允许来自其他线程的写调用继续进行。将允许序列化单个写调用。如果您的协议实现可以通过一个写调用发送所有PDU,则可以。如果一个PDU需要一个以上的写调用,那么当来自多个线程的写调用交错时,传出的PDU可以被分割

从多个线程到一个套接字进行接收调用只是。。。某物即使堆栈内部synchro一次只允许每个套接字一个接收调用,TCP的流性质肯定会以伪任意方式在线程之间分割接收的数据。别这么做,太疯狂了

TCP已经有了一种多路复用数据流的机制——多个套接字。你应该正确使用它们


如果您需要跨一个套接字多路传输数据流,那么应该在TCP之上添加一个数据路由协议,并在一个接收线程中实现该协议。此线程可以保留虚拟连接列表,因此来自其他线程的服务流/消息请求。

首先,每个套接字的发送和接收流是独立的。当一个线程发送另一个线程接收时,应该没有问题

如果多个线程试图写入一个套接字,那么行为通常是未定义的。实际上,来自其中一个线程的写调用将首先进入TCP堆栈状态机中的锁,从而阻止任何其他线程进入、写入其数据、释放锁并退出堆栈,从而允许来自其他线程的写调用继续进行。将允许序列化单个写调用。如果您的协议实现可以通过一个写调用发送所有PDU,则可以。如果一个PDU需要一个以上的写调用,那么当来自多个线程的写调用交错时,传出的PDU可以被分割

从多个线程到一个套接字进行接收调用只是。。。某物即使堆栈内部synchro一次只允许每个套接字一个接收调用,TCP的流性质肯定会以伪任意方式在线程之间分割接收的数据。别这么做,太疯狂了

TCP已经有了一种多路复用数据流的机制——多个套接字。你应该正确使用它们


如果您需要跨一个套接字多路传输数据流,那么应该在TCP之上添加一个数据路由协议,并在一个接收线程中实现该协议。这个线程可以保存一个虚拟连接列表,以及来自其他线程的服务流/消息请求。

@DavidSchwartz是的,我错过了问题的第一部分,正在回答关于一个读卡器+一个写卡器的问题。删除误导性评论。尝试使用更多的线程查看差异,可能你可以看到一些差异。+1对于建议,我将尝试:)@DavidSchwartz是的,我错过了问题的第一部分,并回答了关于一个读者+一个作者的问题。删除误导性评论。尝试使用更多线程查看差异,可能您可以看到一些差异。+1对于建议,我将尝试:)