Чтение из 2 сокетов в 2 потоках приводит к потере данных - PullRequest
0 голосов
/ 09 января 2009

У меня есть многопоточное приложение для Windows C ++, написанное на Visual Studio 6.

В приложении запущены 2 потока, каждый пытается прочитать пакеты UDP на разных портах. Если я защищаю показания от сокета с критическим разделом, тогда все считанные даты в порядке. Без этой защиты данные теряются из обоих сокетов.

Чтение из сокета не безопасно для потоков? В прошлом я написал много приложений для сокетов, и не помню, чтобы мне приходилось использовать такую ​​защиту потоков.

Ответы [ 4 ]

2 голосов
/ 09 января 2009

В приложении запущены 2 потока, каждый пытается прочитать пакеты UDP на разных портах.

Сколько данных UDP вы отправляете / читаете? Как быстро вы отправляете это? Сколько ваших данных потеряно?

Это может быть состояние гонки ... Не между двумя потоками, а между потоком и сокетом!

Я видел проблемы в прошлом портировании кода с Linux на Windows. Windows использует (использовал) размер буфера UDP по умолчанию 8 КБ. Естественно, мы отправляли пакеты по 12 тыс., И просто невозможно было прочитать их достаточно быстро даже с выделенной веткой чтения!

Вы можете изменить размер буфера UDP (под Windows) следующим образом:

int newBufferSize = 128 * 1024;  // 128k
setsockopt( readSocketFd, SOL_SOCKET, SO_RCVBUF, (char *) & newBufferSize );
1 голос
/ 09 января 2009

Winsock не гарантированно является поточно-ориентированным. Это до исполнителя. Посмотрите здесь .

0 голосов
/ 09 января 2009

Вы уверены, что не читаете из того же сокета? В нашей системе мы используем именно это: 2 связанных UDP-сокета + 2 потока для чтения из них. Нет проблем и синхронизации не требуется ..

0 голосов
/ 09 января 2009

Чтение из одного сокета в двух потоках не является потокобезопасным, вы можете не знать наверняка, какой вызывающий абонент получает пакет из буфера основного сокета первым. Запись в сокет тоже самое. Поскольку вы читаете из двух разных сокетов в двух разных потоках (и я предполагаю, что каждый сокет имеет свой собственный поток), он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...