誰でも私にスレッドを理解するのに役立つプロジェクトを書くことを提案できますか?


13

私は現在、C#の開発者であり、スレッドの理解がかなり不安定です。

これらのリンクは両方とも他の投稿で提案されています:

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

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

基礎に戻って、このテーマに関するコンピューターサイエンスのテキストをいくつか見てください。

私が飛び込んでc#ライブラリを使用すると、構築するための強固な知識の基盤が本当になくなると思います。com sciの学生のように、このテーマをゼロから学び、C#ライブラリを使用する必要があると思います。

スレッドを学習するためのアプローチ、おそらくいくつかのリンクやプロジェクトのアイデアを誰でも提案できますか?

前もって感謝します!

編集、すべての返信に感謝します。一部の人は、本は良いアイデアかもしれないと言っていますが、誰かがそれを提案できますか?私は言語にとらわれない何かを好むでしょう。コンピューターサイエンスの学位でこのクラスがカバーされるクラスを誰もが知っていますか?Googleで無料のオンラインメモと割り当てを探しています。


これが役立つかどうかはわかりませんが、これは少し前にVB.Netで書いた、スレッドの基本概念を説明する簡単なチュートリアルです。C#に簡単に変換できるはずです。chrishaas.wordpress.com/2009/06/25/...
クリス・ハース

マルチスレッドGUIを書くことを強くお勧めします。それは、スレッドでできることの限界を教え、正気を保つためです。しかし、それは建設的なものではないので、答えとしてではなく、コメントとして乗りましょう…:-)
ドナルフェローズ

回答:



4

生産者と消費者の問題は典型的な例であり、スレッド化だけでなく、プロセッサのスケジューリング(スレッドではなく子プロセスのfork()を使用して示すことができます)およびプログラムが背後のオペレーティングシステムと対話する方法を理解するのに役立ちますシーン。

スレッド化/分岐について理解する必要がある重要な事項の概要を以下に示します。1.オペレーティングシステムがタスクをスケジュールする方法(ラウンドロビンアルゴリズムなど)2.リソースのロック(複数のスレッドが同じリソースを利用している場合は、同時にそれらにアクセスする-悪いことは起こります)

この古典的な問題に関するwiki記事は次のとおりです。http//en.wikipedia.org/wiki/Producer-consumer_problem

基本的に、「消費者」のスレッドを生成する「プロデューサー」を作成します。プロデューサーは「リソース」を生成し、コンシューマーはそれを消費します。それをループに入れて、何が起こるかを見てください(最終的には、非同期メソッドのために消費者が利用できるリソースよりも多くのリソースを消費することに驚くでしょう)。


興味深いことに、スレッド化されたWindowsサービスを作成する際に、このパターンを認識せずにセットアップしたようです。あなたの説明は完璧でした。知っておくと良いことですが、これは私の未解決の質問に対する回答としてマークされます。
トニー14年

2

古典的な高度に並列な問題の1つを選択します。超線形の高速化を備えたものを選択する方が面白いかもしれません。

ソートされていないインデックスのないリストを検索することを検討してください。この問題はごくわずかです。最初にシングルスレッド検索を実装し、次に単純な並列検索を実装します。盗用を実装します。いくつかのランダムデータセットを生成し、同じデータセットで3つのバージョンをすべて実行します。高速化を計算します。


0

教科書は次のベストステップではないと思います。プロジェクトが進むべき道です。それはあなたが興奮しているものでなければなりません。

初めてスレッドを実行したとき、Webクローラーのパフォーマンスを改善していました。すべてのネットワークIOをシリアルで実行していない場合は、はるかに高速にクロールできます。かなりの数の方法でアプローチできるため、これは素晴らしいプロジェクトですが、たとえばマルチスレッドGUIプログラミングほど複雑ではありません。また、多くの専門的なスキル(たとえば、重い計算能力)は必要ありません。

そのため、ハッキングを開始するための情報を把握してください。何かを始めるのに長くはかからないはずです。優しい紹介です。


私はプロジェクトに同意しますが、ネットワークI / Oはスレッドの良いユースケースではありません。ノンブロッキングI / Oは、スレッドで同じ問題を解決するよりも効率的で、使用するリソースが少なく、競合状態やコーナーケースが少ないというメリットがあります。優れた並列プログラマーになるための学習の一部は、スレッドが理想的でない場合を認識することです。
ベンフォークト

私が言及した経験は、非常に基本的なPython Webスクレイピングであり、マルチスレッド化するために約8行のコードを追加しました。既存のコードと非同期にするのはそれほど簡単だったのではないかと思いますが、間違っているかどうか、どのように間違っているかを知りたいと思います。良い並列プログラマーになるための学習の一部は、良い面と悪い面で多くの経験を積むことだと思います:)
ヘンリー

0

シンプルなスパイアプリとスパイアプリをモデル化します。

各スパイは個別のスレッドで実行されます。

各スパイは他のスパイにダメージを与えることができますが、直接ではありません。

各スパイは他のスパイから貴重なリソースを盗むことができますが、直接ではありません。

両方のスパイは、使用可能なリソースのプールが限られているため、共有する必要があります。一度に1つのスパイのみが特定のリソースを使用できます。


0

私の頭の一番上:ブルース・エッケルの本「Thinking in Java」の4版には、スレッド処理に関する非常に長い章があります(100ページ以上-それ自体がほとんど本です)。私は本の古い版を読んだことがあるので、この章は読みませんでした。しかし、私は彼のブログ投稿(または彼の本のリリースノート)の1つを覚えています。彼は、これを書くのは非常に難しく、最終的には彼にとって本当の成果だったと主張しています。見てみな...

これとは別に、この商用トレーニングサイトにはこの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. スレッド、ThreadPool、BackgroundWorkersなど。

現時点では他のことは考えられません。アルバハリのチュートリアルは本当に良さそうです!


残念ながら、食事の哲学者は有用な問題ではありません。競合状態のデモンストレーションを目的としていますが、デッドロックが実際に発生するかどうかは、システムスケジューラ、その他のタスク、ハードウェア割り込みの変動に左右されます。学習を開始します。
ベンフォークト

1
@Ben Voigt、食事の哲学者の問題は非決定論的であることに同意しますが、スレッド化問題の大部分も決定論的ではないと言えます。コンカレントプログラミングクラスを受講したとき、それは私たちが最初に行った演習の1つでした。今では、先生が必ずしも正しいと主張しているわけではありません。並行性はすばらしかった。DPPは、同時実行の問題の1つのタイプであるデッドロックのみを示しています。OPは、競合状態、ABAの問題なども調査する必要があります。
キリル

@リリック:もちろん、食事の哲学者の問題を理解してください。しかし、私はそれを実装しません。間違ったコードを書くことは、破るのが難しい習慣になります。
ベンフォイット

@Ben Voigt、申し訳ありませんが、私は何かを見逃しているに違いありません。食事の哲学者の問題のポイントは、デッドロックを起こさないプログラムを書くことです。
キリル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.