У меня странная проблема.CSocket :: OnReceive, вызываемый одновременно
void MySocket::OnReceive(int nErrorCode)
{
static CMutex mutex;
static int depth=0;
static int counter=0;
CSingleLock lock(&mutex, true);
Receive(pBuff, iBuffSize-1);
counter++;
depth++; //<-- Breakpoint
log("Onreceive: enter %d %d %d", GetCurrentThreadId(), counter, depth);
.....
Code handling data
depth--;
log("Onreceive: exit %d %d %d", GetCurrentThreadId(), counter, depth);
}
Результаты в этом журнале заявление:
02/19/2014 08:33:14:982 [DEBUG] Onreceive Enter: 3200 1 2
02/19/2014 08:34:13:726 [DEBUG] Onreceive Exit : 3200 2 1
02/19/2014 08:32:34:193 [DEBUG] Onreceive Enter: 3200 0 1 <- Log statement was created but interrupted before it was written to disk
02/19/2014 08:34:13:736 [DEBUG] Onreceive Exit : 3200 2 0
Теперь, что происходит:
- Я запустить программу и отладчик останавливается в точке останова
- пошагово в журнал
- Некоторые, где в журнале отладчик возвращается к точке останова
- Это вторая запись в OnReceive
- Второй вызов завершает
- Первый вызов продолжается
Мои вопросы:
- Как это возможно, чтобы получить два одновременных вызовов в OnReceive
- Почему Mutex не работает (из-за того же самого потока?)
- И как я могу два пути выполнения с одним и тем же ThreadID ???
- И, конечно, как я могу это исправить ??
Обратите внимание, что это происходит только в том случае, если я отправляю много мелких сообщений (< 50Bytes) до блоков отправки. В общей сложности это около 500 КБ/с. Если я поставлю Сон (1) после каждого отправления, этого не произойдет ... но это, конечно, убивает мою скорость передачи.