IOCP: GetQueuedCompletionStatus и потоки
От: mLapo  
Дата: 08.08.07 21:05
Оценка:
Доброго времени суток.
Есть задача реализовать IOCP.
Создал порт:
hCompletionPort = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 2);

"2" поставил ручками, руководствуясь
[msdn]Maximum number of threads that the operating system can allow to concurrently process I/O completion packets for the I/O completion port
[/msdn]
т.к. хочу таки протестить на двух потоках, а проц в машине один

потом навесил на него созданные сокеты
::CreateIoCompletionPort((HANDLE)pSocket->GetSocket(), m_hCompletionPort, (ULONG_PTR)((Socket*)pSocket), 0);


Запустил два потока:

int Run()
{
......
......

BOOL bIORet = ::GetQueuedCompletionStatus(hCompletionPort, &unIoSize, (LPDWORD)&pSocket, &pOverlapped, 5000);
if (!bIORet)  
{
}
else
{
//обработка данных
}
....
.....
return 0;
}


Проблема. При одном потоке все работает прекрасно, при двух я ооочень часто не получаю READ, т.е. как будто до меня не доходит пакет. GetQueuedCompletionStatus просто провисает по таймауту во всех потоках. Но! Если поставить брейк-поинт на хотя бы "if (!bIORet)", то новые пакеты я получать начну (старые уже никогда ). Посылка при любом количестве потоков успешна. Как быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.