#による マルチコアのための非同期/並列処理プログラミング

書籍の概要

この本の概要

いまやマルチコアのCPUは主流と言えますが,その性能を十分に発揮させるためにはソフトウェアもそれに対応し,非同期処理/並列処理でパフォーマンスを上げなければなりません。とは言え,これは一般的なプログラマーには,なかなか普及しづらい技術でもありました。現在のC#には並列処理の機能が多数備わっており,ますます強化されています。また,マイクロソフトのWindows 8以降などでは非同期処理が必須となっています。まだまだ情報が少ない中,よく使われているC#の並列処理の基本を解説する本書は,すべてのプログラマー必読です。

こんな方におすすめ

  • すでに実際の開発は経験しているが並列処理や非同期処理の経験はないC#プログラマー

目次

Part1 マルチコアのための非同期/並列処理の原理
Chapter1 マルチコアを使いこなす非同期処理/並列処理の時代

  • 1.1 これからのUI/UXはこうでなければ!
  • 1.2 UI/UXの課題を解決する非同期処理/並列処理
  • 1.3 .NET Frameworkの非同期処理/並列処理サポート
  • 1.4 非同期処理/並列処理を試して納得するための本書の構成
  • 1.5 非同期処理/並列処理/マルチコアを理解するための用語集

Chapter2 試して納得! マルチコア活用プログラミングの原理とポイント

  • 2.1 コアの能力を使い切る「大喰らい」プログラム
  • 2.2 非同期(並行)処理をさせてみる
    • 2.2.1 非同期処理とは?
    • 2.2.2 非同期処理の開始
    • 2.2.3 処理結果を返す/受け取る
    • 2.2.4 非同期処理の協調と競合
  • 2.3 並列処理をさせてみる
    • 2.3.1 並列処理とは?
    • 2.3.2 実装してみよう
    • 2.3.3 パフォーマンスは得られたか?
  • 2.4 テスト/デバッグの方法
    • 2.4.1 ロジック本体をテスト可能に作る
    • 2.4.2 実行中にデバッガーをアタッチする
  • 2.5 まとめ
  • 2.6 第2章で試したソースコード
    • 2.6.1 「大喰らい」プログラム
    • 2.6.2 「協調」プログラム

Part2 マルチコアを使いこなすための非同期/並列処理必須知識
Chapter1 プロセス/AppDomain/スレッド/タスク……

  • 1.1 マルチプロセスとマルチスレッド
  • 1.2 スレッドコンテキスト
  • 1.3 フォアグラウンドスレッドとバックグラウンドスレッド
  • 1.4 タスク
  • 1.5 スレッドプール

Chapter2 スレッドの開始と完了待ち

  • 2.1 Threadを直接扱う
  • 2.2 ThreadPoolを使う
  • 2.3 delegateを使う
  • 2.4 BackgroundWorkerを使う(.NET 2.0)
  • 2.5 Componentクラスを継承したEAP(.NET 2.0)
  • 2.6 タスクを使う(.NET 4)

Chapter3 スレッド処理完了後に戻り値を取り出す

  • 3.1 Thread/ThreadPool
  • 3.2 delegateのEndInvokeを使う
  • 3.3 BackgroundWorker(.NET 2.0)
  • 3.4 Componentクラスを継承したEAP(.NET 2.0)
  • 3.5 タスク(.NET 4)

Chapter4 スレッド処理完了後に続けて別の処理を実行する

  • 4.1 Thread/ThreadPool
  • 4.2 delegateのコールバック
  • 4.3 BackgroundWorker(.NET 2.0)
  • 4.4 Componentクラスを継承したEAP(.NET 2.0)
  • 4.5 タスクの継続タスク(.NET 4)

Chapter5 async/awaitで継続タスクを簡易表記する

  • 5.1 awaitキーワードの役割
  • 5.2 asyncキーワードの役割

Chapter6 スレッド間で同調させる

  • 6.1 フラグをポーリングして同調
  • 6.2 イベント待機ハンドルを使って同調
  • 6.3 バリアを使って同調(.NET 4)

Chapter7 スレッド間で1つのものを共用する

  • 7.1 Interlockedクラスで整数を共用する
  • 7.2 lockキーワードを使ってオブジェクトを共用する
  • 7.3 Monitorクラスでオブジェクトを共用する
  • 7.4 ReaderWriterLockでオブジェクトを共用する
  • 7.5 MutexやSemaphoreでオブジェクトを共用する

Chapter8 スレッドごとに変数を分ける

  • 8.1 スレッドローカルストレージ

Chapter9 スレッドで発生した例外

  • 9.1 Thread/ThreadPool(.NET 2.0)
  • 9.2 delegateのEndInvoke(.NET 2.0)
  • 9.3 BackgroundWorker/EAP(.NET 2.0)
  • 9.4 タスク(.NET 4)

Chapter10 スレッド処理からの進捗報告

  • 10.1 ワーカースレッドからUIスレッドのメソッドを呼ぶ
  • 10.2 BackgroundWorkerの進捗報告(.NET 2.0)
  • 10.3 IProgressを使った進捗報告(.NET 4.5)

Chapter11 スレッド処理のキャンセル

  • 11.1 BackgroundWorkerのキャンセル(.NET 2.0)
  • 11.2 キャンセルトークンによる方法(.NET 4)
    • 11.2.1 ThreadPoolを使ったスレッド処理の場合
    • 11.2.2 Taskを使ったスレッド処理の場合

Chapter12 ParallelクラスとPLINQ (.NET 4)

  • 12.1 Parallelクラス(.NET 4)
    • 12.1.1 Parallel.For/ForEach
    • 12.1.2 Invoke
  • 12.2 PLINQ(.NET 4)

Part3 マルチコアのためのC#/.NETの非同期/並列処理の方法
Chapter1 例題

Chapter2 .NET 1.x

  • 2.1 ThreadPool.QueueUserWorkItemで並列処理
  • 2.2 スレッド終了をポーリングする非同期処理
  • 2.3 BeginInvoke/EndInvokeで非同期処理(APM)
  • 2.4 Workerクラス

Chapter3 .NET 2.0

  • 3.1 BackgroundWorkerで非同期処理
  • 3.2 Async/Completedで非同期処理(EAP)

Chapter4 .NET 3.5

  • 4.1 BackgroundWorkerで非同期処理

Chapter5 .NET 4

  • 5.1 Taskクラスで非同期処理(TAP)
  • 5.2 Task Parallel Libraryで並列処理
    • 5.2.1 Parallelクラスを使う
    • 5.2.2 PLINQを使う

Chapter6 Silverlight

  • 6.1 Reactive Extensionsで非同期処理

Chapter7 .NET 4.5

  • 7.1 async/awaitで非同期処理
  • 7.2 非同期処理の結果の返し方を見直す
    • 7.2.1 並列処理中の例外
  • 7.3 WinMDの非同期処理

Part4 マルチコア非同期/並列処理実践プログラミング
Chapter1 セルオートマトン「ラングトンのループ」

  • 1.1 ルール
  • 1.2 初期状態

Chapter2 最初の実装

  • 2.1 ルールの表現
  • 2.2 ラングトンのループ
  • 2.3 画面の描画
  • 2.4 実行結果

Chapter3 ロジックと画面を非同期化する

  • 3.1 画面をフリーズさせないための非同期化
  • 3.2 ロジックを全速力で走らせる
    • 3.2.1 リソースの排他を考える
  • 3.3 画面は可能な範囲で描画する
  • 3.4 実行結果

Chapter4 ロジックを並列化する

  • 4.1 Parallel.Forで並列化
    • 4.1.1 書き込みの排他を考える
  • 4.2 実行結果

Chapter5 ロジックを改良する

  • 5.1 2つのループを1つに
  • 5.2 観測用の配列を廃止
  • 5.3 ルールの内部表現をスリム化
  • 5.4 実行結果

Chapter6 まとめ

著者プロフィール

山本康彦(やまもとやすひこ)

1957 年,名古屋に生まれる。名古屋大学工学部卒(修士)。本田技術研究所で自動車の設計/研究にしばらく携わった後,ソフトウェア開発業界に転身。主にWindows系の業務システムを手掛けてきた。.NET FrameworkとC#とは,まだβ版だった2001年からの付き合い。2012年に独立し,現在はWindowsストアアプリをメインに開発している。