2012-05-06 22 views
7

W systemie Linux.Co jest lepszego: wybierz vs wątki?

Chcę zbudować autoclicker, który będzie miał funkcję włączania/wyłączania po naciśnięciu klawisza. Oczywiście powinno być 2 rzeczy działających równolegle (sam pilot i funkcja włączania/wyłączania)

Jakie są minusy i zalety każdej implementacji: Używanie wątku, który obsłuży funkcję autoclicking i inny główny wątek (dla włączania/wyłączania itp.) ... Lub przy użyciu syscall wybrać i czekać na wejście/klawiaturę?

+2

Możesz to zrobić w dowolny sposób. Jakie pomiary definiują tutaj "lepiej"? –

+1

Chcę tylko wiedzieć, jakie są zalety każdej opcji. – Jah

+1

@Jah: Powinieneś był zapytać o to, zamiast pytać, który był "lepszy". –

Odpowiedz

7

Korzystanie z select jest lepsze dla wydajności, zwłaszcza gdy można mieć potencjalnie setki jednoczesnych operacji. Jednak może być trudno poprawnie napisać kod, a styl kodowania bardzo różni się od tradycyjnego programowania z pojedynczym gwintem. Na przykład należy unikać wywoływania jakichkolwiek metod blokowania, ponieważ może to zablokować całą aplikację.

Większość osób uważa, że ​​użycie nici jest prostsze, ponieważ większość kodu przypomina zwykły kod z pojedynczym gwintem. Jedyną trudną częścią jest w kilku miejscach, w których potrzebujesz komunikacji międzyprzeglądowej, poprzez muteksy lub inne mechanizmy synchronizacji.

W twoim konkretnym przypadku wydaje się, że potrzebujesz tylko niewielkiej liczby wątków, więc wybrałbym prostszy model programowania z wykorzystaniem wątków.

+5

Cytat potrzebny do zdania pierwszego. Podejrzewam, że w nowoczesnych systemach jest to o wiele bardziej skomplikowane. Z pewnością z * wieloma * deskryptorami plików w akcji, wątki pozwalają jądru po prostu obudzić wątek, który jest blokowany zamiast 'select', aby wielokrotnie skanować' N' bitów w tablicy i dodawać/usuwać siebie z kolejki oczekiwania dla każdego . Wątki wydają się również być w stanie zoptymalizować pod kątem najmniejszej liczby przejść między użytkownikami. Mogą istnieć inne ortogonalne powody, dla których wątki są wolniejsze, ale nie sądzę, że jest to tak prosta i jednoznaczna sprawa. –

1

Biorąc pod uwagę ilość pracy, którą wykonujesz, prawdopodobnie to nie ma znaczenia.

W przypadku aplikacji o wysokiej wydajności istnieje różnica. W takich przypadkach trzeba obsługiwać kilka tysięcy połączeń jednocześnie; w takich przypadkach przekazujesz nowe połączenia do nowych wątków.

Tworzenie kilku tysięcy wątków jest kosztowne, więc wybór jest wykorzystywany dla zwiększenia wydajności. W rzeczywistości do optymalnego przełączania są stosowane różne techniki, takie jak kqueue lub epoll.

Mówię, że to nie ma znaczenia, ponieważ prawdopodobnie utworzysz tylko jeden wątek i będziesz mieć dokładnie dwa wątki działające przez cały okres użytkowania aplikacji.