Jakie są fałszywe pomysły, które zniechęcają ludzi do używania wątków? [Zamknięte]


12

Implementacja wątków w programie jest trudna, tak, jednak dlaczego niektórzy ludzie ich nie implementują, nawet jeśli jest to oczywiste.

Przykład: program musi załadować zestaw danych z bazy danych, należy nawiązać połączenie i pobrać dane z bazy danych w wątku roboczym, a następnie załadować je do GUI, pozostawiając wątek GUI responsywny dla użytkownika .

Ale nie, rozmawiałem z ludźmi, którzy wydają się myśleć, że nici są złe i złe, a co innego i należy ich unikać za wszelką cenę. Słyszałem nawet, że jakiś instruktor klasowy odradzał stosowanie wątków i dlatego nie chciał obejmować ich użycia. CO???

Ponieważ sprzęt przechodzi w procesory wielordzeniowe, myślę, że musimy lepiej rozumieć wątki i nie bać się ich używać. Osobiście uważam to za fascynujący temat.

Więc co słyszałeś o wątkach, które są fałszywe?


Misfits i underachievers nie radzą sobie z wątkami. Prawdziwe pytanie brzmi: co zamierzasz z tym zrobić?
Job

3
To nie są fałszywe pomysły, ale zawsze należy unikać wątków. Wykonuj poprawnie architekturę, aby obsługa wątków była już poprawnie obsługiwana, a każdy programista nie musi tego robić sam. Gdy programiści nauczą się dodawać wątek w każdej sytuacji, będziesz mieć duże problemy.
tp1

Pozwól, że odwrócę twoje pytanie. Czy zastanawiałeś się, czy istnieją alternatywne podejścia do wykorzystania możliwości przetwarzania równoległego? A może po prostu przeskoczyłeś od razu do wątków, ponieważ tak napisano w jakiejś białej księdze, a może dlatego, że według tego, co według lepszych programistów wydawało się fajne? Osobiście podoba mi się pomysł lekkich procesów, które przekazują sobie wiadomości znacznie lepiej niż wątki. Czy jestem leniwy / głupi / śpieszę się? Tak, i wszyscy jesteśmy w różnym stopniu.
user1172763,

Odpowiedzi:


19

Gwintowanie jest trudne

Pewnie. To może być. Jednak ludzie mają ten pomysł w głowie, że jest tak trudny, że nie zawracają sobie głowy próbą jego zrozumienia.

To nie tak, że to niemożliwe.


2
Popieram tę odpowiedź. Ludzie myślą, że to trudne. Nie dzieje się tak jednak, gdy spędzasz wystarczająco dużo czasu, próbując zrozumieć.

11
@Pierre, chciałbym oczekiwać, że wiele definicji ludzi z ciężko jest „trzeba poświęcić wystarczająco dużo czasu, starając się zrozumieć”.
Benjol,

1
Wątek staje się znacznie łatwiejszy dzięki TPL i await/ słowom asynckluczowym :)
Rachel

@Pierre 303: Gdy poświęcisz wystarczająco dużo czasu na zrozumienie, wciąż jest to trudne , a ludzie, którzy najlepiej to rozumieją, najprawdopodobniej unikną go w jak największym stopniu.
Michael Borgwardt,

9

To nie jest część wątków, która jest trudna, ale potrzeba synchronizacji i wszystko inne, co wiąże się z używaniem wątków. W przykładzie GUI, jak powiedzieć głównemu wątkowi, że zestaw danych jest gotowy do dostępu? Czy przekazujesz całą serię oddzwaniania? Czy rozpraszasz całą masę zmiennych kontrolnych w całym kodzie? W niektórych modelach GUI, np. Silverlight, istnieje coś zwanego powinowactwem do wątku, co oznacza, że ​​nie masz dostępu do elementów GUI siedzących w głównym wątku z innych wątków, więc musisz zejść z drogi, aby główny wątek wiedział, że pewne informacje to gotowy do dalszego przetwarzania.

Naprawdę nie słyszałem żadnych fałszywych rzeczy na temat wątków. Właśnie przeczytałem całą masę analiz przypadków sytuacyjnych na temat synchronizacji jako dziwki, gdy używany algorytm nie jest z natury równoległy.


Uwaga do siebie: napisz algorytmy równoległe ... dzięki.
Droogany,

Kolejki wiadomości (takie same jak w MFC). Jednak wydawanie się, że programiści nie sabotowali kolejki komunikatów (poprzez bezpośrednie udostępnianie danych w pamięci), nawet jeśli jest to przestępstwo podlegające ochronie ogniowej, wydaje się nie działać.
rwong

3

Wątek rozwiązuje wszystkie problemy

Jeśli masz problemy z wydajnością należy nie wskoczyć do gwintowania.

Nici są lekkie

Nici są lekkie w dziesiątkach i dwudziestych. Odradzanie tysięcy wątków nie jest.

Wątek jest prosty [Java]

Łatwo jest tworzyć wątki, co nie znaczy, że z tego skorzystasz.


Dla przypomnienia, Mac OS nie pozwala (przy domyślnej instalacji) utworzyć więcej niż 512 wątków.
zneak

1
To naprawdę zależy od twojego języka. Odrodzenie 1 miliona wątków w Erlang jest ledwo zauważalne, nawet na starszym laptopie, nie mówiąc już o nowoczesnym serwerze. W rzeczywistości nie są to tylko wątki, są to procesy na pełną skalę , tj. Znacznie cięższe niż wątki. Oprócz własnego licznika programów i stosu wywołań (które są prawie jedynymi rzeczami, które ma wątek), mają one również własną stertę, a nawet własny moduł wyrzucania elementów bezużytecznych.
Jörg W Mittag,

4
@ Jörg W Mittag: Jestem zdezorientowany twoim komentarzem. Jak erlang zmienia sposób, w jaki system operacyjny tworzy wątek lub proces?
Steven Evers,

1
@SnOrfus: Erlang nie używa wątków systemu operacyjnego. Istnieją obecnie trzy główne implementacje Erlang: BEAM, HiPE i Erjang. BEAM i HiPE są implementacjami natywnymi (które mogą nawet działać bez żadnego systemu operacyjnego) i implementują własne procesy. Erjang działa na JVM i implementuje procesy przy użyciu fantastycznie genialnej biblioteki Kilim.
Jörg W Mittag,

@ Jörg W Mittag: Biorąc pod uwagę moje pytanie programmers.stackexchange.com/questions/28453/… , uważam to za bardzo interesujące. Dziękuję Ci.
Steven Evers,

1

W końcu stracisz wszelkie zyski z wątków, ponieważ naprawianie szalonych błędów, które pojawią się w wyniku korzystania z niektórych bibliotek / funkcji, które nie są bezpieczne dla wątków (czego nie byłeś świadomy), będzie wymagało nadmiernej synchronizacji.

Masz znacznie większe prawdopodobieństwo napotkania błędu, którego nie będziesz w stanie naprawić, jeśli użyjesz wątków, a kiedy nie.


Naprawione błędy? Nie widziałem żadnego z nich wcześniej ...
Adam

Naprawdę nigdy nie widziałeś błędu, którego nie możesz naprawić? W czasie i za wynagrodzenie, które było dostępne?
Kamil Szot,

Jeśli nigdy nie spotkałeś niemożliwego do naprawienia błędu, oznacza to, że nie jesteś wystarczająco długo w branży. W ciągu ponad 12 lat pracy w każdym projekcie, na który patrzyłem, jest co najmniej jeden błąd, którego nikt nie naprawił i nikt nie wie, jak to naprawić, a nawet odtworzyć. Obejmuje to kod, nad którym pracowałem, i kod, który mam dostęp do odczytu (kod open source). Jedyne wolne od błędów oprogramowanie to te, które mają mniej niż 2 lub 3 strony. Ale wydłużenie całego kodu o 1 lub 2 strony nie rozwiązuje w pełni niczego, ponieważ wtedy masz błędy integracyjne.
slebetman

1

Podsumowując punktowo, dlaczego wątki są trudne w użyciu: -
Rzeczy 1) Potrzebujesz synchronizacji i ostrożnych decyzji projektowych o tym, co i kiedy zablokować
2) Brak kontroli przepływu czasu wykonywania
3) Trudne debugowanie
4) (Bardzo niewiele razy) kompatybilność platformy: - Biblioteki istnieją, aby się tym zająć

Fałszywe rzeczy: -
1) mylące koncepcje funkcji bezpiecznego wątku i ponownego wprowadzania danych
2) wątki wyglądają dobrze na papierze, ale są bardzo trudne do wdrożenia


Czy to ma być prawda czy nieprawda? OP zapytał o to, co nie jest prawdą, i odstraszył ludzi od programowania wielowątkowego.
Steven Evers,

w rzeczywistości nie potrzebujesz blokad ani synchronizacji. Istnieją również modele przekazywania wiadomości (np. Erlang, scala) i modele STM (np. Clojure). Ponadto istnieją bezpieczne dla wątków struktury danych, które nie wymagają blokad (ConcurrentHashMap w java) oraz atomowe operacje podstawowe, które nie wymagają blokad.
Kevin

1

Jeśli nie chcesz pisać testów dla swojego kodu, nie używaj wątków.

Wątki nie są przeznaczone dla typowego programisty „kopiuj i wklej”, który nie rozumie podstawowych zasad systemu operacyjnego i architektury komputera. Ponieważ 90% programistów zna tylko Javę, tak naprawdę to nie ludzie powinni używać wątków. Java sprawia, że ​​wątki są „łatwe”, ale widziałem wielu programistów, którzy po prostu myślą, że jeśli użyją struktur zsynchronizowanych, ich kod będzie działał w wątkach… uhm nie.

To powiedziawszy, każdy musi gdzieś zacząć, po prostu nie rób pierwszego wątku, modernizując serwer produkcyjny Twojej firmy.


Czy możesz polecić niektóre zasoby dotyczące prawidłowego wykonywania wątków?
Jonathan

Jestem pewien, że to zostało rozwiązane. Spróbuj zacząć tutaj stackoverflow.com/questions/660621/threading-best-practices
cmcginty

Problem polega na tym, że nawet jeśli masz 100% pokrycia testowego, nie będziesz w stanie dowiedzieć się, czy twoje testy obejmują wszystkie możliwe problemy ze sposobem, w jaki instrukcje przeplatają się ze współdzielonymi zasobami. Z drugiej strony dzięki wspólnej architekturze nic staje się znacznie łatwiejsza.
Zachary K

1

Przykład: program musi załadować zestaw danych z bazy danych, należy nawiązać połączenie i pobrać dane z bazy danych w wątku roboczym, a następnie załadować je do GUI, pozostawiając wątek GUI responsywny dla użytkownika .

Nie widzę, aby ta sytuacja wymagała użycia wątków z co najmniej 4 powodów:

  1. Pobieranie danych powinno być bardzo szybkie.

  2. W wielu aplikacjach z linii biznesowej użytkownik nie ma nic wspólnego z aplikacją w ciągu 1 sekundy lub dwóch czeka na wynik. Ponadto użytkownik będzie musiał poczekać, aż dane wrócą w jakikolwiek sposób, aby ukończyć żądane zadanie. Z drugiej strony zapytanie można zakodować inteligentnie, tak aby pobierało tylko stronę pełną informacji na raz, a inne techniki optymalizacji mogłyby pomóc w czasie odpowiedzi.

  3. W interfejsach internetowych można uaktywnić łącza dotyczące modelu wątków.

  4. Wątki zwiększają złożoność, jak przyznajesz, niektórzy programiści mogą nie być w stanie dodać funkcji lub debugować złożonego kodu.

Moja opinia brzmi: używaj wątków, gdy musisz, ponieważ łatwość konserwacji i niezawodność oprogramowania jest ważniejsza dla organizacji niż elegancja kodu.


1
Twój pierwszy punkt przypomina mi o błędach obliczeń rozproszonych ( en.wikipedia.org/wiki/Fallacies_of_Distribut_Computing ). Okropnie wielu użytkowników może dziko klikać, gdy muszą czekać dłużej niż 1 lub 2 sekundy od punktu 2 na niereagujący interfejs, co pogarsza sytuację.
Zabezpiecz

@ Bezpieczne, link jest interesujący, dziękuję za udostępnienie. Nie jestem pewien, czy kiedykolwiek moglibyśmy skupić uwagę użytkownika na interfejsie, a nawet na całej pracy w dzisiejszych czasach. Zgadzam się z tobą, że na stronach e-biznesu nie chcesz, aby użytkownik w ogóle odszedł.
NoChance

Nie mówię o skupieniu. Gdy użytkownik kliknie przycisk, a interfejs po prostu zawiesza się, ponieważ baza danych jest sprawdzana, bez jakiejkolwiek wizualnej odpowiedzi, że coś zostało zrobione, niektórzy użytkownicy próbują ponownie kliknąć przycisk. I znowu. Następnie spróbuj kliknąć inne przyciski lub opcje. Widziałem, jak robią to administratorzy, którzy powinni wiedzieć lepiej.
Zabezpiecz

Jeszcze gorzej, gdy ekran wyników jest po raz pierwszy rysowany, ale wyświetlany jako pusty. Nie wiem o większości aktualnych wersji, ale wynik wyszukiwania w starszych programach Outlook jest dobrym złym przykładem. Po rozpoczęciu wyszukiwania przez kilka sekund z dużą bazą wyszukiwania pokazuje „Zestaw wyników jest pusty” lub coś w tym stylu, pokazując pierwsze wyniki, gdy zostaną znalezione. Jeśli jesteś zbyt niecierpliwy lub spiesz się, przeszedłeś już do następnego folderu, wierząc, że nic tam nie ma.
Zabezpiecz

1
@Bezpieczeństwo, rozumiem twój punkt widzenia. To, co tu opisujesz, pokazuje dobry przykład niespójnego interfejsu użytkownika. To, co opisałeś, występuje również podczas wyszukiwania plików. Ale jaka jest na to odpowiedź poza informowaniem użytkownika, że ​​wyszukiwanie już się rozpoczęło?
NoChance
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.