Які помилкові ідеї існують, що відлякує людей за допомогою ниток? [зачинено]


12

Так, реально впровадити нитку в програму, але чому деякі люди не реалізуватимуть їх, навіть коли в цьому очевидна потреба.

Приклад: Програма повинна завантажити набір даних із бази даних, що потрібно зробити, це зробити з'єднання та отримати дані з бази даних у робочій нитці, а потім завантажити їх у графічний інтерфейс, залишаючи потік GUI відповідальним для користувача .

Але ні, я розмовляв з людьми, які, здається, думають, що нитки є злими і поганими, а що ні, і варто уникати їх за будь-яку ціну. Я навіть чув, що якийсь класний інструктор радив не використовувати теми, і тому не хотів покривати їх використання. ЩО???

Коли апаратне забезпечення переходить у багатоядерні, я думаю, що нам потрібно краще зрозуміти теми і не боятися їх використовувати. Я вважаю це захоплюючою темою особисто.

То які речі, які ви чули про нарізування, є хибними?


Зловмисники і невиконавці не можуть обробляти нитки. Справжнє запитання: що ти збираєшся з цим робити?
Робота

3
Це не помилкові ідеї, але завжди слід уникати ниток. Робіть свою архітектуру правильно, щоб підтримка нитки вже була належним чином оброблена, і кожному програмісту не потрібно робити це самостійно. Як тільки програмісти навчаться додавати нитку в кожну ситуацію, у вас виникнуть великі проблеми.
tp1

Дозвольте мені повернути це питання. Ви запитували себе, чи існують альтернативні підходи до використання можливостей паралельної обробки? Або ви просто перейшли до нитки, тому що вони сказали, або, можливо, тому, що кращі програмісти здаються здоровими? Особисто мені подобається, що ідея про легкі процеси передачі повідомлень один одному набагато краще, ніж потоки. Я лінивий / дурний / поспішаю? Так - і так ми всі в різному плані.
користувач1172763

Відповіді:


19

Нитки важкі

Звичайно. Це може бути. Однак люди отримують цю думку в голові, що це так важко, що вони не турбуються намагатися зрозуміти це.

Це не так, як неможливо.


2
Я підтримую цю відповідь. Люди думають, що це важко. Однак це не те, коли ви витрачаєте достатньо часу, намагаючись зрозуміти.

11
@Pierre, я б очікувати , що багато визначення людей, які важко є «Ви повинні витратити достатньо часу , намагаючись зрозуміти».
Benjol

1
Тематизація стає набагато простішою за допомогою TPL та await/ asyncключових слів :)
Рейчел

@Pierre 303: Коли ти витрачаєш достатньо часу, щоб зрозуміти, це все ще важко , і насправді люди, які це найкраще розуміють, найімовірніше, щоб уникнути цього, наскільки це можливо.
Майкл Боргвардт

9

Це не складна частина різьби, а необхідність синхронізації та всього іншого, що поставляється з використанням ниток. У вашому прикладі графічного інтерфейсу, як сказати головному потоку, до якого готовий доступ до набору даних? Ви обходите цілу купу зворотних дзвінків? Ви розкидаєте цілу купу контрольних змінних по всьому коду? У деяких моделях GUI, наприклад Silverlight, є щось, що називається спорідненість до потоку, що означає, що ви не можете отримати доступ до елементів GUI, що сидять на головній нитці, з інших потоків, тому вам доведеться виходити зі шляху, щоб головний потік знав певну інформацію. готовий до подальшої обробки.

Я насправді не чула помилок про теми. Я щойно прочитав цілу купу ситуаційних прикладів того, що синхронізація є сукою, коли будь-який алгоритм, який ви використовуєте, по суті не є паралельним.


Примітка до самопису: пишіть паралельні алгоритми ... спасибі.
Droogans

Черги з повідомленнями (такі ж, як у MFC). Однак, змусити програмістів не саботувати чергу повідомлень (шляхом прямого обміну даними в пам’яті), навіть тоді, коли це злочинна злочинність, здається, не вдалося.
rwong

3

Threading вирішує всі ваші проблеми

Якщо у вас виникають проблеми з продуктивністю, ви не повинні переходити до нитки.

Нитки легкі

Нитки легкі в десятках і двадцятих роках. Нерестують тисячі ниток це не так.

Нитка простий [Java]

Створити теми легко, це не означає, що ви отримаєте користь від цього.


Що стосується запису, Mac OS не дозволить вам (при встановленні за замовчуванням) створити більше 512 потоків.
zneak

1
Це дійсно залежить від вашої мови. Нерестування мільйона ниток в Ерланг ледь помітно навіть на старшому ноутбуці, не кажучи вже про сучасний сервер. Насправді це навіть не просто нитки, це повномасштабні процеси , тобто набагато важчі за нитки. На додаток до власного лічильника програм та стека викликів (які є майже єдиними речами, що мають нитку), вони також мають власну купу і навіть власний сміттєзбірник.
Jörg W Mittag

4
@ Йорг W Міттаг: Мене бентежить ваш коментар. Як erlang змінює те, як ОС створює потік чи процес?
Стівен Еверс

1
@SnOrfus: Erlang не використовує потоки ОС. Зараз є три основні реалізації Erlang: BEAM, HiPE та Erjang. BEAM та HiPE - це власні реалізації (які навіть можуть працювати без будь-якої ОС) та реалізувати власні процеси. Ерджанг працює на JVM і реалізує процеси, використовуючи фантастично блискучу бібліотеку Кіліма.
Йорг W Міттаг

@ Jörg W Mittag: Враховуючи моє запитання programmers.stackexchange.com/questions/28453/… , я вважаю це дуже цікавим. Дякую.
Стівен Еверс

1

Ви зрештою втратите будь-які надбавки від нанизування, тому що для виправлення шалених помилок, які виникнуть внаслідок використання деяких бібліотек / функцій, які не є безпечними для потоків (про що ви не знали), буде потрібна надмірна синхронізація.

У вас набагато більша ймовірність зустрітися з помилкою, яку ви не зможете виправити, якщо ви будете використовувати нитки, тоді, коли цього не зробите.


Несправні помилки? Я ще не бачив жодного з таких ..
адамк

Ви справді ніколи не бачили помилку, яку не змогли виправити? У час і за доступну оплату?
Каміль Шот

Якщо ви ніколи не стикалися з непоправною помилкою, то ви давно не були у цій галузі. За мої 12+ років роботи кожен проект, який я коли-небудь переглядав, має принаймні одну помилку, яку ніхто не виправив, і ніхто не знає, як виправити або навіть відтворити. Це включає код, над яким я працював, і код, у якого я маю доступ читати (відкритий код). Єдине програмне забезпечення, яке не містить помилок, - це ті, які мають менше 2 або 3 сторінок. Але створення коду на 1 або 2 сторінках довго не вирішує повністю нічого, тому що у вас є помилки інтеграції.
slebetman

1

Підсумовуючи точку розуму, чому нитки важко використовувати: -
Справжні речі 1) Потрібна синхронізація та ретельні проектні рішення щодо того, що заблокувати та коли заблокувати
2) Немає контролю над потоком часу виконання
3) Складне налагодження
4) (Дуже мало часи) сумісність платформи: - Бібліотеки існують, щоб подбати про це

Неправдиві речі: -
1) Заплутані поняття безпечної для потоків та повторної функції
2) Нитки виглядають добре на папері, але їх дуже важко реалізувати


Вони повинні бути правдивими чи неправдивими? ОП запитав про те, які речі, які НЕ так, і відлякати людей від виконання багатопоточних програм.
Стівен Еверс

насправді вам не потрібні блокування чи синхронізація. Існують також моделі передачі повідомлень (наприклад, erlang, scala) та STM-моделі (наприклад, clojure). Крім того, існують безпечні структури даних, для яких не потрібні блокування (ConcurrentHashMap в Java) та атомні примітиви, які не потребують блокування.
Кевін

1

Якщо ви не хочете писати тести для свого коду, не використовуйте теми.

Нитки не призначені для типового програміста "копіювати та вставляти", який не розуміє основних основ ОС та комп'ютерної архітектури. Оскільки 90% програмістів знайомі лише з Java, це насправді не люди, яким слід користуватися потоками. Java робить потоки "легкими", але я бачив багато програмістів, які просто думають, що якщо вони будуть використовувати синхронізовані структури, їх код буде працювати в потоках .... ем ні.

При цьому всі повинні десь починати, тільки не робіть свій перший проект для модернізації продуктивного сервера для виробництва продукції.


Чи можете ви порадити деякі ресурси щодо того, як правильно робити теми?
Джонатан

Я впевнений, що це вирішено. Спробуйте почати тут stackoverflow.com/questions/660621/threading-best-practices
cmcginty

Проблема в цьому полягає в тому, що навіть якщо ви будете мати 100% тестовий покрив, ви не зможете знати, чи будуть ваші тести охоплювати всі можливі проблеми з тим, як інструкції переплітаються із спільними ресурсами. З іншого боку, зі спільною архітектурою нічого, що стає набагато простіше.
Захарій К

1

Приклад: Програма повинна завантажити набір даних із бази даних, що потрібно зробити, це зробити з'єднання та отримати дані з бази даних у робочій нитці, а потім завантажити їх у графічний інтерфейс, залишаючи потік GUI відповідальним для користувача .

Я не бачу, що ця ситуація означає необхідність використання нарізки принаймні з 4 причин:

  1. Пошук даних повинен бути дуже швидким.

  2. У багатьох програмах «Лінійний бізнес» користувач не має нічого спільного з додатком за 1 секунду або дві, які він / вона чекає результату. Також користувачеві доведеться почекати, поки дані повернуться будь-яким способом, щоб виконати бажане завдання. З іншого боку, запит можна кодувати інтелектуально таким чином, що він одночасно отримує лише повну сторінку інформації, а інші методи оптимізації можуть допомогти в часі відповіді.

  3. У веб-інтерфейсах посилання можуть бути активовані щодо моделі різьблення.

  4. Тема додає складності, як ви визнаєте, деякі розробники внизу лінії можуть не мати змоги додати функції або налагодити складний код.

Моя думка: використовуйте нитку, коли потрібно, тому що технічна ремонтопридатність та надійність є більш цінними для організації, ніж елегантність коду.


1
Ваш перший пункт нагадує про помилки розподілених обчислень ( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing ). Надзвичайно багато користувачів можуть почати дико натискати навколо, коли їм доведеться чекати більше 1 або 2 секунд від точки 2, щоб не реагувати на інтерфейс, що робить гірше.
Безпечний

@Secure, посилання цікаве, дякую, що поділилися ним. Я не впевнений, що в цей день і вік ми могли весь час зосередити увагу користувачів на інтерфейсі або навіть на всій роботі. Я згоден з вами, що на веб-сайтах електронного бізнесу ви не хочете, щоб користувач взагалі відходив.
NoChance

Я не кажу про фокус. Коли користувач натискає кнопку, а інтерфейс просто застигає, оскільки база даних запитується, без візуальної відповіді, що щось робиться, деякі користувачі намагаються знову натиснути кнопку. І знову. Потім спробуйте натиснути інші кнопки або параметри. Я бачив, як це роблять адміністратори, які повинні знати краще.
Безпечний

Ще гірше, коли екран результатів спочатку малюється, але відображається порожнім. Не знаєте про більшість поточних версій, але результат пошуку в старих Outlooks є хорошим поганим прикладом. При запуску пошуку на кілька секунд із великою базою пошуку відображається "Набір результатів порожній" або щось подібне, показуючи перші результати, коли вони знайдені. Якщо ви занадто нетерплячі або поспішаєте, ви вже перейшли до наступної папки, вважаючи, що нічого там немає.
Безпечний

1
@ Безпечно, я бачу вашу думку. Те, що ви тут описуєте, показує хороший приклад непослідовного інтерфейсу користувача. Те, що ви описали, також виникає під час пошуку файлів. Але яка відповідь на це, крім того, щоб сказати користувачеві, що пошук вже розпочався?
NoChance
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.