web-dev-qa-db-ja.com

並行性とマルチスレッドアプリケーションについて学習するための最適なリソースは何ですか?

マルチスレッドアプリケーションと並行プログラミングに関しては、知識に大きなギャップがあることに気付きました。これまでにいくつかの基本事項を説明しましたが、そのほとんどは私の頭から消えてしまったようであり、それは間違いなく、私がもっと知りたい、そして必要としている分野です。

並行アプリケーションの構築について学ぶための最良のリソースは何ですか?私は非常に実用的な指向の人なので、この本に具体的な例が含まれていればより良いですが、私は提案を受け入れるつもりです。個人的には、疑似コードまたはC++で作業することを好みます。ゲーム開発に傾けるのが最善ですが、必須ではありません。

16
Zepee

これらは私が最近役に立つと思った本です:

Java同時実行の実際 -Javaの同時実行ユーティリティの多くの作者による。多少Java固有ですが、スレッドの危険性と落とし穴について非常に明確で有益です。

The Art of Concurrency -タイトルが示唆するように、実用的なアドバイスと例のかなり民俗的で現実的な概要であるように、きらめく理論的な論文ではありません。

JVMでのプログラミングの並行性 -これは実際にはきらめく理論的な論文ですが、非常に読みやすく、洞察に富んでいます。 STMまたはアクターとは何か、長所と短所は何か、理由を知る必要がある場合は、この本で説明します。

インテルスレッディングビルディングブロックやAppleのグランドセントラルステーションなど、多くの専用ユーティリティライブラリがあります。これらには通常、専用のマニュアルがあり、通常は非常に優れています。大きなライブラリを作成したい場合は、必ず読む必要があります。

6
Kilian Foth

同時実行モデルは多数あるため、どれを選択するかを決定する前に、すべてについて十分に理解しておくことをお勧めします。そのため、私は本 7週間の7つの並行性モデル:スレッドが解けるとき をお勧めします。レビューと目次を確認すると、これが良い本である理由がわかります。そしてそれも最近(2014年)です。

4
sakisk

私は、ジョーアルバハリによって提供されたこの無料のスレッドリソースが優れていることを発見しました...

C#のスレッディング

C#に傾いていますが、概念は他の言語に完全に適用できます。彼はまた、チュートリアルをPDF英語および他のいくつかの言語でのダウンロードとして提供しています。コード例のステップバイステップの説明と優れたシーケンスおよび状態図の組み合わせにより、私はそれをお勧めします例を添付します。

チュートリアルは5つのパートに分かれています。

その本の形でここに利用できます: 一言で言えばC#4. (章23と24)

4
dodgy_coder

現在、C++標準にはスレッド機能があります。したがって、C++で学習したい場合は、一般的なスレッドチュートリアルに進む前に、新しい言語機能の簡単なレビューを読むことをお勧めします。次に戻って、標準を後で詳細に確認します。

実際には、スレッディングは、ほとんどの人が理解していると思うものの、理解していないものの1つです。 IBM研究データベース(Java)、Linuxファイルシステム(C)、およびその他のかなり注目度の高いプロジェクトで競合状態を特定した静的分析研究者の話に行きました。一部のプロジェクトは、同時実行性とスレッド化の専門家によって書かれました。スレッドセーフなコードを作成することは困難であり、知識のギャップはそれを自分自身で認識している人に限定されないことに注意してください。

ゲームプログラミングで直接役立つわけではありませんが、いくつかのMPIチュートリアル(申し訳ありませんが、特定の推奨事項はありません)を参照することをお勧めします。スレッドで正しい同時実行コードを書くのは難しいようですが、間接的には、さまざまな同時実行モデルを調査することで、コードをスレッドセーフに構成するための独自の思考プロセスに役立つことが期待されます。

1
ccoakley

並行性について学ぶには、並行性のために設計された言語を使用してください。 Golang は、並行性のサポートが組み込まれており、ほとんどのプログラマーが言語を簡単に習得できるようにするCのような構文を備えているため、良い選択です。

メッセージパッシング、同時実行性のニーズのほぼすべてをカバーするミューテックスなどがあり、他の言語ではより複雑な同等物があります。

たとえば、CではMPIを使用して、別のスレッドから変数aにintを受け取ります。

MPI_Recv(&a, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,MPI_STATUS_IGNORE);

Goで別の(ユーザー)スレッドから変数aにintを受け取る:

a := <-c

実際に行くことを学ぶために、ブラウザーでgoコードを記述、コンパイル、実行できるgoツアーをチェックしてください。

tour.golang.org

同時実行部分にスキップするには

http://tour.golang.org/concurrency/1

私の前の教授は、並行性のトピックについて、初年度のCS学生のための非常に人気のある短いコースを開催しました。並行性とは何かについての簡単で完全な紹介として、これを読むことをお勧めします。

並行プログラミングの基礎

1
Johan Wikström