Jarosław
Rybski
Programista
C/C++/Python
Temat: Zapewnić istnienie określonej liczby wątkow
Witam,Mam problem z pewnym zadaniem.
Aplikacja łączy się z serwerem poprzez protokół TCP/IP.
Zawiera wątki. Zadaniem wątku jest wysłanie do serwera ciągu znaków np: 'x1', 'x2', 'x3' ... 'x9999' - oraz otrzymanie odpowiedzi w stylu wszystko ok lub błąd;
Chciałbym aby jednocześnie było uruchomionych około 100 wątków w porywach +- 10. Jak wiadomo CreateThread utworzy mi 10 tys wątków w niespełna kilka, kilkanaście sekund ale wątki nie wysyłają tak szybko danych. Każdy wątek potrzebuje kilku sekund na wykonanie zadania.
Zrobiłem tak:
#define MAX_THREADS 10000
HANDLE hT[MAX_THREADS];
DWORD dwId;
for(int i = 0; i < MAX_THREADS; i++)
{
pthread_mutex_lock(&mutex);
if (iAktualnaLiczbaWatkow < 100)
{
hT[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadMain, (LPVOID)i, 0, &dwId);
if (hT[i]==NULL) i--;
}
else
{
i--;
}
pthread_mutex_unlock(&mutex);
}
WaitForMultipleObjects(MAX_THREADS, hT, TRUE, INFINITE);
for(int i = 0; i < MAX_THREADS; i++)
{
CloseHandle(hT[i]);
}
ale niestety nie działa po mojej myśli. Wbrew oczekiwaniom posiadam od 150 do 200 wątków przez około jedną minutę a przy wzroście obciążenia aktualna liczba wątków spada do 120. Bardzo duży rozrzut niestety.
Funkcja uruchamiana jako watek zwiększa licznik oraz zmniejsza go gdy watek kończy się.
DWORD ThreadMain( LPVOID iParam )
{
pthread_mutex_lock(&mutex);
iAktualnaLiczbaWatkow++;
pthread_mutex_unlock(&mutex);
int icnt = (int)iParam;
...
...
...
closesocket(sClient);
pthread_mutex_lock(&mutex);
iAktualnaLiczbaWatkow--;
pthread_mutex_unlock(&mutex);
return 1;
}
Ma ktoś z Was ciekawy sposób na zapewnienie istnienia określonej liczby wątków przez cały okres działania programu.