- ベストアンサー
マルチスレッドプログラミングの良技術書籍
C++言語を用いてマルチスレッドを用いた開発を行う予定ですが、 当方マルチスレッドを用いた開発の経験がなく、 事前に前提知識を付けておきたいと思うのですが、 マルチスレッドプログラミングにおいて、 この書籍が分かりやすい、もしくはバイブル的な書籍があれば、 ご教示お願い致します。 ちなみに開発環境はVC++2005です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
http://www.amazon.co.jp/dp/4756116825 かなり古いけどお勧め。 ちなみにSolarisとWindowsでは殆ど互換(パラメタの並びがちがうだけ)ですがLinuxでは動きません。
その他の回答 (7)
- BLK314
- ベストアンサー率55% (84/152)
>スレッドの同期処理や個数制限ってむずかしくありません? 確かに難しいです。 いつも悩まされます。 ですけど Win32マルチスレッドプログラミング には、いろんな手法が載っていますので、役立つと思います。 直接スレッドだけでなく、非同期I/OとかAPCとかI/O 完了ポート とか... I/O完了ポートはまだ、本格活用していないですが、 スレッド・プールを使いI/Oに基づいて、 スレッド数上下限の範囲内で スレッドをSuspend/Resumeしてくれる優れものらしいです。 >あと、マルチプロセッサを意識してコーディングすると >たしかにCPUを効率よく使用できますが、それはつまり >一つのアプリがCPUを振り切ることにもつながるので >せっかくのマルチコアがもったいなくなるのではとも思っています。 それはあると思います。 私の場合は、制御系の仕事が多いので、 "暇なコアがあるともったいない"的な感覚もあります。 なんせ、制御しながら、 バックで相当量の計算をおこなうなんてこともよくあるので... ”スレッドをうまく制御すれば、計算がもっと早く終わるんじゃない? 現にコアが1つ暇そうにしてるし...” みたいなこともあります。 やはり、こういう本を参考に いろんな技術を適材適所で使うのも大事だなって感じてます。
- tsuduki999
- ベストアンサー率35% (6/17)
OpenMPがもつ一番の魅力は、自分で構築したらすごくシビアになるヘルパースレッドを コンパイラレベルで自動生成してくれているようなところだと思ってます。 そういう意味では、ワーカースレッド的には使わないかもしれませんね。 #6 にて指摘もされましたが、 確かにGUI環境で処理の完了を待ち続けるのはやってはいけないです。 僕も印刷するのにスレッドがいらないとか非現実的なことを いうつもりはありません。 僕がスレッドの生成について否定的な部分というのは、 印刷させるとか投げっぱなしジャーマン状態のワーカースレッドじゃなくて 一つの処理を分担して行い、その結果をマージするような ヘルパースレッドの生成について、作り込むには微妙だなぁというのが正直なところです。 スレッドの同期処理や個数制限ってむずかしくありません? あと、マルチプロセッサを意識してコーディングすると たしかにCPUを効率よく使用できますが、それはつまり 一つのアプリがCPUを振り切ることにもつながるので せっかくのマルチコアがもったいなくなるのではとも思っています。 バッチ処理系の環境を占有しているようなものならいいけど、 リアルタイム系の処理はちょっとこわいかなーと。 でも、OpenMPにしろ、通常のスレッドにしろ、 マルチスレッドの知識は必要ですね。 必要以上にスレッド(or子プロセス)を作りすぎでサーバーをストールさせたりとか かえって性能を落とさないようにするとか、そういった注意事項を知る上でも 本は読んでおいて損はないと思います。 僕は読まずにやって、↑みたいな失敗をやっちゃっていますので(笑 ちなみに、リンク先はOpenMPの公式サイト(英語)です。 参考まで。
- 参考URL:
- http://openmp.org/wp/
- BLK314
- ベストアンサー率55% (84/152)
OpenMPについては、性能が低いという指摘も多いです。 http://www.na.cse.nagoya-u.ac.jp/~reiji/lect/hpc02/OpenMPintro.html そのうち、向上が図られるとは思いますが.... 私は、No.5さんとは逆に "本格的なWinプログラミングにマルチ・スレッドは不可欠" と考えています。 Windowsアプリはメッセージ駆動ですよね。 メッセージ応答は、ASAP(できるだけ早く)戻る必要があります。 メッセージ応答処理中で5秒も10秒もかかっていたら どうなるか? ハングアップしたとみなされるかも知れません。 それでも、長い処理をどうしても行わなければならない場合は どうするか? スレッドに頼るしかありません。 WM_TIMERに回す手もありますが、 こいつは優先度も低くく、 おまけに 複数回が1回にまとめられたりもするので、 いまいち、安定性にかけると言わざるを得ません。 GUIも軽くしながら、バックグラウンド処理も効率的かつ安定的に行う。 それには、やはり、スレッドが適していると考えます。 ま、 バックグラウンド処理が、たとえば、印刷処理のような 時間的に”厳しくない"処理であれば、タイマーとかでも十分なので、 最終的には、"使い分け"ということになろうかとは思うのですが... デュアルコアも普及してきた昨今 マルチ・スレッドは益々重要になると考えています。 単純な並列化であればOpenMPが有利という話もよく耳にします。 (大量の計算を複数コアで同時に行わせるとか...) しかし、各処理の優先度等、様々な要因を考慮し、 最適なプログラミングを行う必要がある場合には、 まだ”人手"が必要なようです。
- tsuduki999
- ベストアンサー率35% (6/17)
まるで関係ないお話で恐縮ですが 今ならOpenMPという技術もあるので そちらを勉強してみるのも手かと思いますよ~ VC2005では対応していませんけど。 gcc 4.2 以降とか VC2008なら使えるみたいです。 マルチスレッドって同期処理が難しいので、 なにげに、利用機会ものすごく少ないです。
- BLK314
- ベストアンサー率55% (84/152)
No.2です。 あちゃ~。ごめんなさい。 リンク切れになっておりました。 改めて紹介させてください。 http://ascii.asciimw.jp/books/books/detail/4-7561-1404-0.shtml "Win32マルチスレッドプログラミング" James E.Beveridge,Robert Wiener共著/有限会社インフォビジョン訳 ASCII出版 ISBN:4-7561-1404-0 (978-4-7561-1404-4) です。 本の内容は、以前紹介したので省略します。 ご迷惑おかけしました。
- sho1get
- ベストアンサー率57% (20/35)
私も良くマルチスレッドのアプリケーションを作成することがありますが、「Advanced Windows」という書籍はとても良いと思います。 (ジェフリーリッチャー著) 数多くの書籍を探してきましたが、今のところこれ以上の書籍と出会ったことはありません。 値段は少々高いですが(1万円くらい)、マルチスレッドでの排他的制御方法なども濃く記載されており、サンプルコードも豊富なのでよろしいかと思います。 ちなみに現在は第5版が出版されており、上下に分かれています。 それぞれ5000円くらいです。 第5版はVistaで追加された関数なども取り上げられているので、Vista向けのアプリケーションを開発するなら第5版が宜しいかと思います。 XP以下の場合は第4版で十分対応できますよ。 「Advanced Windows 第4版」 http://ascii.asciimw.jp/books/books/detail/4-7561-3805-5.shtml
- BLK314
- ベストアンサー率55% (84/152)
スレッドというのは、OSによりかなり扱い方が異なります。 それらを吸収してくれる、ライブラリ等もありますが、 スレッドの性能を引き出す為には、やはり、 OSの内部構造の知識が必要です。 そこで、Win32に絞った書籍を紹介します http://www1.axfc.net/uploader/S/so/47938 Win32にターゲットを絞って、スレッド及びその周辺(非同期I/Oなど) を丁寧に解説されています。ソースコードもたくさん例示されています。 ただし、NT4.0ベースなので、現時点では若干"古い"気がします。 (当然ですが、 .NET等は扱っていません) しかし、スレッドの基盤となっている技術や、 スレッドを扱う上での基本的な注意点 (排他やデッドロックetc) は今も昔もそうそう変わらないものです。 その意味では、十分すぎるほど役立つ書籍です。
お礼
皆様多数のご回答ありがとうございます。 皆様のご意見を参考に、書籍を探してみます。 ありがとうございました。