Ograniczanie liczby połączeń w accept

0

Witam,
Mam następujący problem:

  • piszę aplikację która ma obsłużyć maksymalnie N połączeń za pomocą wątków
  • rozpoczynanie nowego wątku odbywa się w pętli nieskończonej

Problem jest następujący: co zrobić, gdy maksymalna liczba wątków zostanie przekroczona? U mnie wpada w petle nieskonczona i z powodu nieuruchamiania accept bardzo wzrasta uzycie CPU. Czy jest jakis typowy sposob na tego typu problem?

Kod wygląda mniej więcej tak:

  while(1) {
  /*
   *  Glowna petla serwera oczekujaca na polaczenia.
   */
    if(aktywnych_watkow  == N) {
      printf("Przekroczono limit uzytkownikow\n");
      continue;
    }

    /* Znajdz pierwszy wolny slot na watek */
    for(i = 0; i < !slots[i].is_empty; ++i);
	
    if( (user_slots[i].sockd = accept(serwersockfd, (struct sockaddr*) &(slots[i].s), &len)) == -1 ) {
      fprintf(stderr, "Accept call failed!\n");
      continue;  
    }
    
    /* Wystartuj watek uzytkownika */
    start_user_thread(user_slots, i);
    ++aktywnych_watkow;
  }
0

lepiej by było zapisać zamiast
if(aktywnych_watkow == N) to : if(aktywnych_watkow > N) wtedy masz pewność że więcej niż N użytkowników nie będzie.

0

Teraz jest ok, tzn. tworzę tyle wątków ile chcę. Przetestowane.

Pytanie jak rozwiązać problem nieskończonej pętli, gdy maksalna ilość wątków zostanie utworzona?

0

spróbuj po tym: if(aktywnych_watkow > N) dać "break;" jeśli o to Ci chodzi
drugim sposobem jest, utworzenie zmiennej np bool exit = false;
w pętli zamiast while(1) dać while(!exit)
a po tym :
if(aktywnych_watkow > N) dać exit = true;

0

Jeżeli wykonam break to przerwę główną pętle serwera, a tu nie o to chodzi.

Założenia jest następujące:

  1. While(1) musi być nieskończoną petlą, ponieważ inaczej spowoduje to zakończenie aplikacji i przerwi pracę klientów podłączonych do serwera.
  2. Nie można tak po prostu przerwać tej pętli, ponieważ zakłóci to pracę serwera (konkretnie zakończy jego pracę i uniemożliwi obsługę potencjalnych klientów w przyszłości, a klient może się odłączyć), jeżeli się odłączy to pętla ta ma znów się wykonywać. Idealnie opcja to zamrożenie pętli w momencie wejścia do bloku if(aktywnych_watkow == N) i odmrożenie jej, gdy dowolny z klientów przerwie połączenie. Spowoduje to nie wpadnięcie w pętle nieskończoną i umożliwi obsługiwanie nowych połączeń.
if(aktywnych_watkow  == N) {
      printf("Przekroczono limit\n");
      /*
       * Zamroz wykonywanie petli do momentu, az aktywnych_watkow < N
       */
      continue;
}
0

Bardzo ważna informacją, którą zapomniałem podać: programuje pod Linuksem, do tworzenia wątków używam biblioteki pthreads.

0

w tym ifie zrób pętle while(xyz==N lub tam większe jak chcesz) przez co program zatrzyma się na tej pętli a nie pójdzie dalej.

0

Zatrzyma się, okay i będzie w stanie wznowić w momencie, gdy zmniejszy się liczba połączeń. Ale ta pętla będzie nieskończona i będzie kosztowała bardzo dużo CPU, a tego właśnie chcę uniknąć.

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