我有一个用Visual Studio 6编写的多线程Windows C ++应用程序。
在应用程序中,2个线程正在运行,每个线程都尝试读取不同端口上的UDP数据包。如果我保护带有关键部分的插座的读数,则所有读取的日期都可以。没有这种保护,两个插座都会丢失数据。
从套接字读取不是线程安全吗?我以前编写了很多套接字应用程序,并且不记得必须使用这种线程保护。
答案 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个线程来读取它们。没有问题,也没有同步..