Хтось може запропонувати мені написати проект, який допоможе мені зрозуміти нарізку


13

Зараз я розробник C # з досить хитким розумінням нарізки.

Обидва ці посилання були запропоновані в інших публікаціях:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

Чи варто повернутися до основ і, можливо, переглянути деякі тексти інформатики на цю тему?

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

Чи може хто-небудь запропонувати підхід до вивчення нитки, можливо, деякі посилання та ідеї проекту?

Спасибі заздалегідь!

Редагувати, дякую за всі відповіді. Деякі люди згадували, що книга може бути хорошою ідеєю, хтось може запропонувати її? Я вважаю за краще щось агностичне. Хтось знає, до якого класу було б охоплено цей матеріал у ступені інформатики? Я намагаюся в Google отримати кілька безкоштовних онлайн-записок та завдань.


Я не знаю, чи це допомагає, але це простий підручник, який я написав у VB.Net ще трохи назад, в якому пояснюється основна концепція нитки. Ви повинні мати можливість перетворити його на C # досить легко. chrishaas.wordpress.com/2009/06/25/…
Кріс Хаас

Я дуже спокушаюся запропонувати написати багатопотоковий графічний інтерфейс, виходячи з того, що це навчить межі того, що можна робити з потоками, і залишатись здоровим. Але це не буде конструктивним, тому я дозволю їхати як коментар, а не відповідь… :-)
стипендіати Donal

Відповіді:


3

Написати багатопотоковий веб-сервер. Ви дізнаєтесь ТОН . І не лише про нарізування різьби.


4

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

Ось ознайомлення з важливими речами, які ви повинні розуміти щодо нарізування / розкручування 1. Як операційна система планує завдання (наприклад, алгоритм кругової роботи) 2. Блокування ресурсів (Якщо кілька потоків використовують один і той же ресурс, ви не хочете, щоб вони отримуватимете доступ до них одночасно - БАЙТЕ ЧАСИ ДОВІДКОВІ)

Ось стаття у вікі про цю класичну проблему: http://en.wikipedia.org/wiki/Producer-consumer_problem

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


Цікаво, здається, я налаштував цей шаблон, не усвідомлюючи його під час створення служби з потоковими вікнами. Ваш опис був ідеальним. Добре знати, це було б майже позначено як відповідь на моє відкрите запитання.
Тоні

2

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

Розгляньте пошук через несортований та нерозроблений список. Ця проблема тривіально паралельна. Спочатку реалізуйте один потоковий пошук, потім наївний паралельний пошук. Виконайте крадіжку роботи. Створіть кілька випадкових наборів даних та запустіть усі три версії в одних і тих же наборах даних. Обчисліть швидкість.


0

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

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

Отже, з’ясуйте деяку інформацію, щоб скребти і почати хакерство. Не займе у вас багато часу, щоб щось почати, це буде ніжне вступ.


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

Ви, можливо, маєте рацію, досвід, про який я мав на увазі, був дуже елементарним веб-скребтуванням Python, де я додав близько 8 рядків коду, щоб зробити його багатопотоковим. Я сумніваюся, що це було б так просто зробити асинхронізацією з існуючим кодом, але я хотів би дізнатися, чи / як я помиляюся. Я думаю, що частиною навчання бути хорошим паралельним програмістом може бути багато досвіду під вашим поясом, хороший і поганий :)
Генрі

0

Моделюйте просту програму Spy vs. Spy.

Кожен шпигун працює на окремій нитці.

Кожен шпигун може завдати шкоди іншому шпигуну, але не безпосередньо.

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

Обидва шпигуни мають у своєму розпорядженні обмежену кількість ресурсів, і вони повинні їм ділитися. Лише один шпигун може одночасно використовувати будь-який ресурс.


0

У верхній частині голови: У 4-му виданні книги Брюса Еккеля "Мислення на Яві" є дуже довгий розділ про нарізання різьби (> 100 сторінок - майже маленька книга сама по собі). Я читав старіші видання книги, і тому не читав цієї глави; але я пам’ятаю одне з його публікацій у блозі (або записки до випуску його книги), де він стверджує, що писати це було дуже важко, і врешті-решт це було справжнім досягненням для нього. Перевір...

Окрім цього, на цьому комерційному навчальному сайті є 2,5-годинний відеокурс, але ви можете отримати безкоштовну пробну версію (потрібно залишити дані кредитної картки; тому не забудьте скасувати підписку)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

Чи варто повернутися до основ і, можливо, переглянути деякі тексти інформатики на цю тему?

Це завжди вдалий вибір, і я б рекомендував вам взяти гарну книгу для різьблення, щоб ознайомитися з нарізкою різьби. Я навчився багатопотоковому перекладу на Java, а знання перекладався досить легко на C #.

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

Вам потрібно вивчити кілька речей, коли ви вступаєте в багатопотоковість:

  1. Різні способи синхронізації (семафор, мютекс тощо)
  2. Атомні операції (у C # це робиться через Interlocked для операцій, які за замовчуванням не є атомними).
  3. Одночасне програмування без блокування.
  4. Одночасне програмування без очікування.
  5. Нитки, нитки балів, фонові робочі тощо

Я не можу думати про інші речі на даний момент. Підручник Albahari виглядає дійсно добре!


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

1
@Ben Voigt, я погодився б, що проблема філософів-ресторанів не є детермінованою, але я б сказав, що більшість проблем з ниткою теж не детерміновані. Коли я брав одночасно заняття з програмування, це була одна з перших вправ, яку ми зробили, тепер я не стверджую, що вчитель був обов’язково правий, але він, безумовно, був одним з найкращих учителів, які я мав, і його вмінням пояснювати та викладати паралельність була чудовою. DPP демонструє лише один тип випуску одночасності: тупиковість. ОП також має вивчити умови перегонів, проблему ABA тощо.
Кирило

@Lirik: Зрозуміло, зрозумійте проблему філософів їдальні. Але я б не реалізував це. Писати неправильний код може стати важкою звичкою порушувати.
Бен Войгт

@Ben Voigt, вибачте, мені, мабуть, щось не вистачає: суть проблеми філософів-ресторанів полягає в тому, щоб написати програму, яка не заходить у глухий кут, то як би вирішення DPP вимагало написання "неправильного коду"?
Кирило
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.