Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wywoływanie accept() [socket] przez wiele wątków

Ostatnio zmodyfikowano 2015-12-27 21:19
Autor Wiadomość
ktos-tam
Temat założony przez niniejszego użytkownika
Wywoływanie accept() [socket] przez wiele wątków
» 2015-12-24 23:33:30
Witam, zacząłem pisać własny serwer http, który ma się składać z wątku nasłuchującego i nieokreślonej liczby wątków - workerów. Wydaje mi się, że najlepiej będzie, jeżeli to właśnie workery będą wywoływać funkcję accept(). I tutaj pojawia się pytanie - czy ta funkcja może być wywoływana przez wiele wątków jednocześnie, czy jednak muszę zadbać o to, aby w danym czasie tylko jeden wywoływał tę funkcję? Przypuśćmy, ze dwa wątki skończyły obsługiwać swoich klientów i są gotowe do przyjęcia następnych zapytań. Tak więc chcą zaakceptować nowe połączenia. Jeżeli oba wywołają accept(), zanim nadejdzie nowe połączenie, to czy nie spowoduje to jakiegoś błędu? Np. oba zaczną obsługiwać jednego klienta.
P-142319
j23
» 2015-12-25 11:28:36
Nie rozumiem, dlaczego wywołania accept chcesz rozdzielić na kilka wątków, przecież będzie sensowniej jeśli będzie jeden wątek odbierający połączenia (czyli wywołania accept) i pozostałe to ich obsługi.
P-142339
ktos-tam
Temat założony przez niniejszego użytkownika
» 2015-12-26 18:31:16
Cóż, można tak i tak, dużej różnicy nie ma. Wybrałem tę metodę, ponieważ uznałem, że to będzie mi łatwiej zaimplementować, a workery przejmą wtedy więcej roboty od głównego wątku, będą także równomierniej obciążone.
P-142389
ktos-tam
Temat założony przez niniejszego użytkownika
» 2015-12-27 00:30:26
Ponieważ nie mogłem znaleźć odpowiedzi, a na czekanie nie mam czasu, wykodowałem sobie odpowiedź. W programie dwa wątki wywoływały accept(), zanim nadeszło jakieś zapytanie. Wszystko działało poprawnie, wątki odpowiadały naprzemiennie, odpowiedzi nie dublowały się. Tak więc problem chyba rozwiązany, ale do końca pewien nie jestem. Wygląda na to, że jest tu jakiś wbudowany mechanizm kolejkowania.
P-142399
j23
» 2015-12-27 12:08:54
Generalnie funkcje systemowe, w tym sockety, są thread-safe, więc używanie accept w taki sposób jak napisałeś problemów sprawiać nie powinno. Co do kolejki, to tak, nadchodzące połączenia są kolejkowane (w drugim parametrze funkcji listen możesz określić maksymalny rozmiar kolejki połączeń oczekujących).
P-142405
ktos-tam
Temat założony przez niniejszego użytkownika
» 2015-12-27 21:19:53
To że nadchodzące połączenia są kolejkowane to wiem, chodziło mi o kolejkę podmotów wywołujących, zgodnie z którą accept() zwraca deskryptory.
P-142435
« 1 »
  Strona 1 z 1