Asynchroniczny read() duże zużycie procesora

0

Witam,
Piszę wielowątkową aplikację serwerową, w której każdego klienta obsługuje osobny wątek. Używam funkcji read/write, włączyłem działanie asynchroniczne:

int flags;
flags = fcntl(socket,F_GETFL,0);
assert(flags != -1);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);

Obsługę socketa robię tak:

        for ( ; ; )
	{
		memset(pClient.data_buff, 0x00, sizeof(pClient.data_buff));
		n = read( *pClient.con_fd, (void *)pClient.data_buff, bytes_to_read );
		if (n == 0)
		{
			printf("Connection reset by peer!\r\n");
			//tu zwalniam zasoby i niszcze watek
		}
		else if (n == -1) //tu wysylamy dane
		{
			switch(value)  //tu cos robie i np wysylam dane do klienta
			{
				case 1:
					...
					break;
				default:
                                        ...
					break;
			}
			value = 0;
			usleep(5000);   //opoznienie 5ms, zeby nie zrzeralo proca, no wlasnie...
		}
		else	//tu odbieramy
		{
			make_packet(&pClient, n);
		}
	}

usleep(5000); zastosowałem, gdyż bez wstrzymania, jeden wątek zabierał 100% zasobów procesora. Przy zwłoce 5ms, zużycie procesora przy 2 działających wątkach oscyluje w okolicy 1%. Ale aplikacja w tym czasie nic nie robi, nie ma komunikacji sieciowej.
Pytanie:
Jak rozwiązać obsługę socketa, tak abym miał możliwość równocześnie pisać/czytać z klientem oraz, żeby nie zajmowało to zbędnych zasobów procesora?

0

pod jakim OS'em ma pracować aplikacja? windows i linux mają inny system zarządzania procesami i na to też trzeba brać poprawkę podczas pisania tego typu aplikacji. radzę zapoznać się z tematem programowania współbieżnego oraz o wątkach pod kątem konkretnego systemu.

tak to widzę.

0

System to Linux 2.6.32-5-amd64

0

Skoro każdy klient pracuje w osobnym wątku, nie ma sensu używać nieblokujących socketów. Możesz spróbować użyć strace (np. strace -ff -o log ./program) żeby zobaczyć co faktycznie się dzieje. Jeśli już upierasz się przy nieblokujących operacjach, poczytaj o select/poll/epoll, sposób z usleep() jest słaby.

0

A co ma używanie wątków do bezsensowności stosowania nieblokujących operacji? Przecież jak mi read() zablokuje wątek to nic nie zrobię... W każdym razie dzięki za rady, poczytam o select/poll. Czekam na dalsze propozycje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1