2009-01-09 32 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