2009-01-09 31 views
0

我有一个多线程Windows C++编写的应用程序在Visual Studio 6在2线从2个插槽读取导致数据丢失

在应用程序2个线程运行的每个尝试读取不同端口的UDP数据包。如果我使用关键部分保护套接字的读数,那么读取的所有日期都很好。如果没有这种保护,数据将从两个套接字中丢失。

是否从套接字读取不是线程安全的?我过去写过很多套接字应用程序,不记得必须使用这种线程保护。

+0

也许你还可以添加到你的问题的一些的API调用您的使用来获得数据? – 2009-01-09 07:51:05

回答

2

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

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

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

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

你可以像更改(Windows下)的UDP缓冲区大小:

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

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

0

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

1

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