从2个线程中的2个套接字读取会导致数据丢失

时间:2009-01-09 07:32:12

标签: c++ sockets

我有一个用Visual Studio 6编写的多线程Windows C ++应用程序。

在应用程序中,2个线程正在运行,每个线程都尝试读取不同端口上的UDP数据包。如果我保护带有关键部分的插座的读数,则所有读取的日期都可以。没有这种保护,两个插座都会丢失数据。

从套接字读取不是线程安全吗?我以前编写了很多套接字应用程序,并且不记得必须使用这种线程保护。

4 个答案:

答案 0 :(得分:2)

在应用程序中,2个线程正在运行,每个线程都尝试在不同的端口上读取UDP数据包。

您发送/读取的UDP数据量是多少?发送速度有多快?你的数据丢失了多少?

这可能是竞争条件...... 不在两个线程之间,而是在线程和套接字之间!

我在过去将代码从Linux移植到Windows时遇到了问题。 Windows使用(使用)默认UDP缓冲区大小为8k。当然,我们发送了12k连发,即使使用专用的读取线程,也没有办法快速读取它!

您可以使用以下内容更改UDP缓冲区大小(在Windows下)

int newBufferSize = 128 * 1024;  // 128k
setsockopt( readSocketFd, SOL_SOCKET, SO_RCVBUF, (char *) & newBufferSize );

答案 1 :(得分:1)

不保证Winsock是线程安全的。这取决于实施者。看看here

答案 2 :(得分:0)

从两个线程中的一个套接字读取不是线程安全的,您可能不确定哪个调用者首先从底层套接字缓冲区获取数据包。写入套接字是一样的。既然你是从两个不同线程中的两个不同的套接字读取的(我假设每个套接字都有自己的线程),它应该可以工作。

答案 3 :(得分:0)

你确定你不是在同一个插座上读书吗?在我们的系统中,我们正是使用这个:2个绑定的UDP套接字+ 2个线程来读取它们。没有问题,也没有同步..