2011-01-05 3 views
1

Просто пытаюсь подружиться с некоторыми опытными гуру темы, пытаясь узнать больше о потоковом без многих реальных проблем с кодом в тот момент, который поможет мне больше практиковать.Thread Learning

У меня есть некоторые ресурсы, но уже, вероятно, есть некоторые хорошие, я не знаю там:

  1. C# 2008 and 2005 Threaded Programming: Beginner's Guide (Book) (это один я думаю о том, начиная смотреть на первый)
  2. CLR via C# (Dev-Pro) (у меня есть эта книга также и Джефри имеет некоторые потоковую вещи здесь тоже)
  3. Threading in C# - eBook
  4. Concurrent Programming on Windows
  5. .NET Multi-threading Book from 2003 (Book) (не уверен, если этот материал устарел ...)

Итак:

1) Looking для других (видео, книги и т.д.), а также то, что Ваше мнение на ресурсов выше (вы бы рекомендовали некоторые из них лучше или те, которые устарели/плохи?).

2) Кроме того, поскольку это широкая и очень сложная тема ... будучи полным иностранцем, я пытаюсь сузить какой-то нормальный список исследований. Threading is deeeeeeeep, поэтому я просто хочу осветить основы или, скорее всего, те области, которые они, вероятно, коснутся (блокировка, потокобезопасность и т. Д.). Мне не нужно входить в это интервью как эксперт ... просто покажите, что я не совсем понимаю, когда использовать его, общие сценарии и пару примеров, которые я могу им объяснить.

3) Любой, у кого есть проблемы с резьбой, чтобы указать мне на некоторые хорошие ресурсы или дать мне несколько полезных советов или областей, которые, по вашему мнению, я должен определенно поднять?

4) Очевидно, что с появлением .NET 4.0, который меняет ситуацию вообще, но я сосредоточен на .NET 3.5 в основном здесь. Мне нужно только сначала знать основы РЕЗЬБЫ ... концепцию, вещи, о которых нужно знать, блокировку, потокобезопасные синглтоны (я знаю страницу Джона Скита о синглтонах и т. Д.).

5) Другая вещь, которая поможет мне, - это примеры реальных причин и причины использования потоков. Как на стороне IIS, так и на стороне ООП, серверных фермах и т. Д. Мне бы хотелось узнать некоторые реальные примеры использования потоков или общих сценариев в реальных приложениях, где вам действительно нужно начать использовать потоки.

Мне не нужны все, чтобы ответить на все 5 из моих областей здесь ... даже если бы совет в одном из 1-5 выше был бы весьма признателен.

Спасибо ... не

UPDATE/ОТКАЗ (после получения несколько предположений обо мне)

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

+3

Извинения, но вы получите работа на неправильных условиях, если они ищут кого-то, кто знает потоки, и вы только что прочитали об этом. Просто скажите, что это: вы мало знаете о потоке, но узнаете, прежде чем приступить к работе там. – jgauffin

+0

Дэвид, мне просто не нравятся программисты, которые все время сидят и сука и делают бесконечные предположения. Это досадно, черт возьми. Есть ли кнопка удаления комментариев в Stackoverflow? Люди слишком дерзкие, и, если я кажусь самоуверенным, это потому, что я устал от того, что надменными разработчиками сидят и действуют так, как моя мама делает предположения о чем-то, не спрашивая меня, каким будет мой подход, когда я пойду в интервью. Во всяком случае, я не собираюсь сахара пальто, как я себя чувствую на форуме ... будет на работе, но не здесь ... так оно и есть. – PositiveGuy

+0

Прокомментировал комментарий честно chibacity, о котором я говорю. В чем смысл ... это очевидно. Почему бы не ответить тем, что помогает ответить на мой вопрос. – PositiveGuy

ответ

2

Threading может показаться очень простым в изучении. Вы просто используете new Thread(ThreadFunc).Start() и вуаля, вы используете потоки. Как это трудно, не так ли?

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

Через некоторое время вы обнаружите, что вам необходимо выполнить синхронизацию перед изменением данных общего доступа. И когда вы начнете это делать, вы увидите, что большая производительность ухудшается.

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

Что касается темы, которые вы должны научиться:

  1. Посмотрите на некоторые примеры использования Thread класса.
  2. Ключевое слово lock.
  3. Асинхронное программирование (это очень легко сделать не так, просто посмотрите на все СО-вопросы об этом). .Net использует BeginXXXX/EndXXXX для асинхронного программирования.
  4. Другие методы блокировки замка, чем, например Semaphore и ReaderWriterLock
  5. Interlocked класс.

Я обычно использую этот шаблон для Thread функций:

public class Example 
{ 
    ManualResetEvent _myEvent = new ManualResetEvent(false); 
    Thread _myThread; 
    bool _isRunning = true; 

    public Example() 
    { 
     _myThread = new Thread(WorkerFunc); 
     _myThread.Start(); 
    } 


    public void WorkerFunc() 
    { 
     while (_isRunning) 
     { 
      try 
      { 
       _myEvent.Wait(Timeout.Infinite); 
       _myEvent.Reset(); 
       ActualFunc(); 
      } 
      catch (ThreadAbortException) { return; } 
      catch (Exception err) 
      { 
       _logger.Error("Thread func failed, lucky we caught it so the server don't die..", err); 
      } 
     } 
    } 

    public void Stop() 
    { 
     _isRunning = false; 
     _myEvent.Set(); 
     _myThread.Join(); 
    } 

    public void DoWork() 
    { 
     //add some work to the thread job queue or something 
     _myEvent.Set(); 
    } 

    private void ActualFunc() 
    { 
     //actual thread work is done here 
     // in a seperate method to keep everything clean. 
    } 
} 

Просто написал здесь в ответ, не обещают, что она будет работать на 100% :)

+0

Спасибо !!! очень полезно для START для потоковой передачи. – PositiveGuy

+0

Я обновил ответ (после прочтения ваших комментариев вопроса) – jgauffin

+0

спасибо человеку. +1 для вас. – PositiveGuy

1

Приятное введения в Многопоточность http://www.albahari.com/threading/ , хотя новые модели многопоточности и методы введены в .NET 4.0 и даже в C# 5.0 предварительного просмотра, это было бы хорошим введение для погружения в тему.

Вы также должны прочитать о пулах потоков.