Может кто-нибудь предложить проект для меня написать, чтобы помочь мне понять потоки

13

Я в настоящее время разработчик C # с довольно шатким пониманием потоков.

Обе эти ссылки были предложены в других сообщениях:

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

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

Должен ли я вернуться к основам и, возможно, взглянуть на некоторые компьютерные тексты по этому вопросу?

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

Может кто-нибудь предложить подход к изучению потоков, может быть, некоторые ссылки и / или идеи проекта?

Заранее спасибо!

Редактировать, спасибо за все ответы. Некоторые люди упоминали, что книга может быть хорошей идеей, может кто-нибудь предложить? Я бы предпочел что-то не зависящее от языка. Кто-нибудь знает, к какому классу будет относиться этот материал в области компьютерных наук? Я пытаюсь найти в Google бесплатные онлайн заметки и задания.

bplus
источник
Я не знаю, помогает ли это, но это простое учебное пособие, которое я недавно написал в VB.Net и объясняет основную концепцию многопоточности. Вы должны быть в состоянии преобразовать это в C # довольно легко. chrishaas.wordpress.com/2009/06/25/…
Крис Хаас
У меня есть искушение предложить написать многопоточный графический интерфейс на том основании, что он будет учить ограничениям того, что можно делать с потоками, и оставаться в здравом уме. Но это не будет конструктивно, поэтому я позволю ему выступить в качестве комментария, а не ответа… :-)
Donal Fellows

Ответы:

3

Написать многопоточный веб-сервер. Вы выучите тонну . И не только о потоке.

GrandmasterB
источник
4

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

Вот краткое изложение важных вещей, которые вы должны понимать в отношении потоков / разветвления 1. Как операционная система планирует задачи (например, алгоритм циклического перебора) 2. Блокировка ресурсов (если несколько потоков используют один и тот же ресурс, вы не хотите, чтобы они быть доступным к ним в одно и то же время

Вот статья в вики по этой классической проблеме: http://en.wikipedia.org/wiki/Producer-consumer_problem

По сути, создайте «Producer», который порождает темы «Consumers». Производитель производит «ресурс», а потребители его потребляют. Поместите это в цикл и посмотрите, что произойдет (вы будете удивлены, что в конечном итоге потребители будут потреблять больше ресурсов, чем доступно из-за несинхронизированных методов).


источник
Интересно, кажется, я установил этот шаблон, не осознавая этого при создании службы многопоточных окон. Ваше описание было идеальным. Полезно знать, это будет почти отмечено как ответ на мой открытый вопрос.
Тони
2

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

Попробуйте поискать в несортированном и неиндексированном списке. Эта проблема тривиально параллельна. Сначала реализуйте однопоточный поиск, затем наивный параллельный поиск. Реализовать работу-воровство. Создайте несколько случайных наборов данных и запустите все три версии на тех же наборах данных. Рассчитайте ускорение.

Бен Фойгт
источник
0

Я не думаю, что учебник - следующий лучший шаг. Проект - это путь. Это должно быть чем-то, что вас волнует.

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

Таким образом, выяснить некоторую информацию, чтобы очистить и начать взлом. Это не займет у вас много времени, чтобы начать что-то, это будет мягкое введение.

Генри
источник
Я согласен с проектом, но сетевой ввод-вывод не подходит для потоков. Неблокирующий ввод-вывод более эффективен, использует меньше ресурсов и страдает от меньшего количества состязаний и угловых ситуаций, чем та же проблема, решаемая с потоками. Частью обучения быть хорошим параллельным программистом является признание того, что потоки не идеальны.
Бен Фойгт
Вы вполне можете быть правы, опыт, на который я ссылался, был очень простой веб-анализ Python, где я добавил около 8 строк кода, чтобы сделать его многопоточным. Я сомневаюсь, что было бы так просто сделать это асинхронно с существующим кодом, но я хотел бы знать, если / как я не прав. Я думаю, что часть обучения тому, чтобы быть хорошим программистом на параллельных программах, может заключаться в том, чтобы иметь большой опыт за плечами, хороший и плохой :)
Генри
0

Смоделируйте простое приложение Spy vs. Spy.

Каждый шпион работает в отдельном потоке.

Каждый шпион может нанести урон другому шпиону, но не напрямую.

Каждый шпион может украсть ценные ресурсы у другого шпиона, но не напрямую.

Оба шпиона имеют в своем распоряжении ограниченный пул ресурсов и должны делиться ими. Только один шпион может использовать любой данный ресурс одновременно.

Майк Хофер
источник
0

Сверху головы: в 4-м издании книги Брюса Экеля «Мышление на Java» есть очень длинная глава о потоке (> 100 страниц - почти маленькая книга сама по себе). Я читал старые издания книги и поэтому не читал эту главу; но я помню одно из его сообщений в блоге (или заметки о выпуске его книги), где он утверждает, что написать это было очень сложно, и в конце концов это было для него настоящим достижением. Проверьте это ...

Помимо этого, на этом коммерческом учебном сайте есть этот 2,5-часовой видеокурс, но вы можете получить бесплатную пробную версию (необходимо оставить данные кредитной карты; не забывайте отписываться)

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

KNB
источник
0

Должен ли я вернуться к основам и, возможно, взглянуть на некоторые компьютерные тексты по этому вопросу?

Это всегда хороший выбор, и я бы порекомендовал вам выбрать хорошую книгу по потокам, чтобы ознакомиться с потоками. Я изучил многопоточность в Java, и эти знания довольно легко перешли на C #.

Если вам нужен практический пример, то я бы порекомендовал вам попробовать проблему философов-столовых .

Вам нужно научиться нескольким вещам, когда вы попадаете в многопоточность:

  1. Различные способы синхронизации (семафор, мьютекс и т. Д.)
  2. Атомарные операции (в C # это делается через Interlocked для операций, которые не являются атомарными по умолчанию).
  3. Параллельное программирование без блокировок.
  4. Параллельное программирование без ожидания.
  5. Threads, ThreadPools, BackgroundWorkers и т. Д.

Я не могу думать о других вещах в данный момент. Учебник Albahari выглядит действительно хорошо!

Кирил
источник
К сожалению, обедающие философы не являются полезной проблемой. Предполагается, что это демонстрация условий гонки, но на самом деле возникает ли взаимоблокировка, зависит от капризов системного планировщика, других задач, аппаратных прерываний ... короче говоря, это абсолютно недетерминировано, и я думаю, что это не очень хорошее место для начать учиться.
Бен Фойгт
1
@ Бен Фойгт, я бы согласился, что проблема обедающих философов не является детерминированной, но я бы сказал, что большинство проблем с потоками также не являются детерминированными. Когда я проходил параллельный урок программирования, это было одно из первых упражнений, которые мы сделали, теперь я не утверждаю, что учитель был обязательно прав, но он, безусловно, был одним из лучших учителей, которых у меня были, и его способность объяснять и преподавать параллелизм был превосходным. DPP демонстрирует только один тип проблемы параллелизма: взаимоблокировка. ОП также должен учитывать условия гонки, проблему АВА и так далее.
Кирилл
@Lirik: Конечно, понять проблему столовых философов. Но я бы не стал это реализовывать. Написание неправильного кода может стать сложной привычкой.
Бен Фойгт
@ Бен Фойгт, извините, я, должно быть, что-то упускаю: суть проблемы столовых философов - написать программу, которая не блокируется, так как для решения DPP потребуется написание «неправильного кода»?
Кирил