• ベストアンサー

マルチスレッドプログラミングの良技術書籍

C++言語を用いてマルチスレッドを用いた開発を行う予定ですが、 当方マルチスレッドを用いた開発の経験がなく、 事前に前提知識を付けておきたいと思うのですが、 マルチスレッドプログラミングにおいて、 この書籍が分かりやすい、もしくはバイブル的な書籍があれば、 ご教示お願い致します。 ちなみに開発環境はVC++2005です。

noname#95666
noname#95666

質問者が選んだベストアンサー

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

http://www.amazon.co.jp/dp/4756116825 かなり古いけどお勧め。 ちなみにSolarisとWindowsでは殆ど互換(パラメタの並びがちがうだけ)ですがLinuxでは動きません。

その他の回答 (7)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.8

>スレッドの同期処理や個数制限ってむずかしくありません? 確かに難しいです。 いつも悩まされます。 ですけど Win32マルチスレッドプログラミング には、いろんな手法が載っていますので、役立つと思います。 直接スレッドだけでなく、非同期I/OとかAPCとかI/O 完了ポート とか... I/O完了ポートはまだ、本格活用していないですが、 スレッド・プールを使いI/Oに基づいて、 スレッド数上下限の範囲内で スレッドをSuspend/Resumeしてくれる優れものらしいです。 >あと、マルチプロセッサを意識してコーディングすると >たしかにCPUを効率よく使用できますが、それはつまり >一つのアプリがCPUを振り切ることにもつながるので >せっかくのマルチコアがもったいなくなるのではとも思っています。 それはあると思います。 私の場合は、制御系の仕事が多いので、 "暇なコアがあるともったいない"的な感覚もあります。 なんせ、制御しながら、 バックで相当量の計算をおこなうなんてこともよくあるので... ”スレッドをうまく制御すれば、計算がもっと早く終わるんじゃない? 現にコアが1つ暇そうにしてるし...” みたいなこともあります。 やはり、こういう本を参考に いろんな技術を適材適所で使うのも大事だなって感じてます。

noname#95666
質問者

お礼

皆様多数のご回答ありがとうございます。 皆様のご意見を参考に、書籍を探してみます。 ありがとうございました。

回答No.7

OpenMPがもつ一番の魅力は、自分で構築したらすごくシビアになるヘルパースレッドを コンパイラレベルで自動生成してくれているようなところだと思ってます。 そういう意味では、ワーカースレッド的には使わないかもしれませんね。 #6 にて指摘もされましたが、 確かにGUI環境で処理の完了を待ち続けるのはやってはいけないです。 僕も印刷するのにスレッドがいらないとか非現実的なことを いうつもりはありません。 僕がスレッドの生成について否定的な部分というのは、 印刷させるとか投げっぱなしジャーマン状態のワーカースレッドじゃなくて 一つの処理を分担して行い、その結果をマージするような ヘルパースレッドの生成について、作り込むには微妙だなぁというのが正直なところです。 スレッドの同期処理や個数制限ってむずかしくありません? あと、マルチプロセッサを意識してコーディングすると たしかにCPUを効率よく使用できますが、それはつまり 一つのアプリがCPUを振り切ることにもつながるので せっかくのマルチコアがもったいなくなるのではとも思っています。 バッチ処理系の環境を占有しているようなものならいいけど、 リアルタイム系の処理はちょっとこわいかなーと。 でも、OpenMPにしろ、通常のスレッドにしろ、 マルチスレッドの知識は必要ですね。 必要以上にスレッド(or子プロセス)を作りすぎでサーバーをストールさせたりとか かえって性能を落とさないようにするとか、そういった注意事項を知る上でも 本は読んでおいて損はないと思います。 僕は読まずにやって、↑みたいな失敗をやっちゃっていますので(笑 ちなみに、リンク先はOpenMPの公式サイト(英語)です。 参考まで。

参考URL:
http://openmp.org/wp/
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.6

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が有利という話もよく耳にします。 (大量の計算を複数コアで同時に行わせるとか...) しかし、各処理の優先度等、様々な要因を考慮し、 最適なプログラミングを行う必要がある場合には、 まだ”人手"が必要なようです。

回答No.5

まるで関係ないお話で恐縮ですが 今ならOpenMPという技術もあるので そちらを勉強してみるのも手かと思いますよ~ VC2005では対応していませんけど。 gcc 4.2 以降とか VC2008なら使えるみたいです。 マルチスレッドって同期処理が難しいので、 なにげに、利用機会ものすごく少ないです。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

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)
回答No.3

私も良くマルチスレッドのアプリケーションを作成することがありますが、「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)
回答No.2

スレッドというのは、OSによりかなり扱い方が異なります。 それらを吸収してくれる、ライブラリ等もありますが、 スレッドの性能を引き出す為には、やはり、 OSの内部構造の知識が必要です。 そこで、Win32に絞った書籍を紹介します http://www1.axfc.net/uploader/S/so/47938 Win32にターゲットを絞って、スレッド及びその周辺(非同期I/Oなど) を丁寧に解説されています。ソースコードもたくさん例示されています。 ただし、NT4.0ベースなので、現時点では若干"古い"気がします。 (当然ですが、 .NET等は扱っていません) しかし、スレッドの基盤となっている技術や、 スレッドを扱う上での基本的な注意点 (排他やデッドロックetc) は今も昔もそうそう変わらないものです。 その意味では、十分すぎるほど役立つ書籍です。

関連するQ&A

  • マルチスレッドプログラミングについて

    C言語のマルチスレッドについて学びたいと思っています。 「猫でも分かる」のマルチスレッドの項を見てみましたが、 もうちょっと色々コードのサンプルを見てみたいと思いました。 そこで他にマルチスレッドを解説しているサイトを探そうと検索してみても、 書籍情報ばかりが出てきて、なかなか解説サイトを探せませんでした。 マルチスレッドの簡潔なサンプルが載っているようなサイトがあれば教えていただけたらと思います。

  • 非同期プログラミングは必ずマルチスレッド?

    非同期プログラミングは必ずマルチスレッドプログラミングになりますか? ここでいう非同期プログラミングとは、 何かのメソッドを実行してその処理(処理Aとする)の結果を待たずに次の処理Bを実行できて、処理Aが終わったらコールバックやデリゲートで、あらかじめ決められたメソッド(finishとする)が呼ばれるといったものです。 処理Aを実行するメソッドを呼ぶ ↓ すぐに処理Bを実行開始(このときバックグラウンドで処理Aが走っている) ↓ 処理Aが終了したのでfinishメソッドが実行される 例えば、Objective-CのNSURLConnectionで非同期通信するときのようなやつです。 こういった非同期プログラミングは、必ずマルチスレッドを使うことになりますか? 普通、別スレッドで処理させるときはスレッド用のライブラリを使うなどして明示的にマルチスレッドプログラミングをしますが、上のように非同期のメソッドを使うと、その裏で自動的に別のスレッドが動くのでしょうか。 それとも、単一スレッドのみで、非同期プログラミングできるでしょうか。 なお、特殊な言語やOSによっては、いくらでも可能性があると思いますので、 メジャーな環境(Windowsや、スマホ) のみに限定してお願いします。言語で言うと、C、C++、Objective-C、Javaあたり。 また、上の「処理A」が終わったとき、メソッド「finish」が呼ばれるとすると、 処理Bの実行中にどのようなタイミングでfinishが呼ばれるのでしょうか。 処理Bはどのような形でfinishに切り替わるのでしょうか。いきなりfinishに処理を奪い取られるのでしょうか

  • やさしく楽しくプログラミングを学べる書籍を探しています

    やさしく楽しくプログラミングを学べる書籍を探しています プログラミングを学びたいんですが、メールかインターネット操作ぐらいでプログラミングは全くといってもいいほどやっていないので普通のプログラミング言語の解説書だと尻込みしてしまいます。 そこで「マンガ・たのしくよくわかるプログラミング入門」といったような漫画やイラストでやさしく解説されていて、未経験者でも楽しく、途中で投げ出さずに最後まで読みきり、学ぶことができるお勧めの書籍をご存知ですか? ご教授願います。

  • プログラミングの歴史についての詳しい書籍はありますか?

    プログラミングの歴史についての詳しい書籍はありますか? プログラミング言語の歴史について知りたいのですが、その歴史に関する書籍やWebサイトはありますか(書籍の方が大歓迎です)。 例えば、オブジェクト指向言語はC++よりSmallTalkから出てきたし、JavaVMや.NET CLRに使われている仮想マシンはLisp言語が使われているとか、WindowsOSやMacOSもUNIXの影響で作られているし、C++やJava,PHP等の言語は、いずれもCに似た文法だし・・・ それを詳しく解説している資料を探しています。 それにしても、最近Lispの新しい本が出ているようですが、これは何があるでしょうか。

  • 古くならない技術書

    技術書の多く(プログラミング言語の入門書やアプリケーションの操作方法、CMSの使い方)などは すぐに内容が古くなってしまいますが、 刊行されてから時間がたっているのに内容が古くならない、 バイブルのような書籍を教えてください。 とくにプログラミング関連の書籍を知りたいです。

  • VC++ express editionでマルチスレッドは可能ですか?

    VC++ express editionでマルチスレッドは可能ですか? Visual C++ 2008 express edition で マルチスレッドプログラミングは可能でしょうか? ちょっと調べたところ、2005(MFC)ならば簡単にできるようですが。 (すみません、MFCがどういうものか良く理解できていない者です)

  • 書籍の情報をください

    猫でもわかるネットワークプログラミングという書籍です。 この書籍をここでは書籍と呼びます。 私はこの書籍が何言語で書かれていて、開発環境がWindows系かLinux系かを知りたいです。レビューなどに多少は載っているのですが情報が非常に少ないです。なのでみなさんに教えていただこうと思いここに質問を投稿いたしました。特に何言語で書かれているかが知りたいです。

  • マルチスレッドのやり方

    MacでC言語の勉強をしています。 WindowsでBASICのプログラム経験が多少あり、 C言語のサイトも参考にしていたので、Macでも同じように出来るかな? と思っていると、出来ませんでした。 CreateThread関数を使おうとしていたのですが、Cではwindows.hのようなファイルを参考にしたサイトではインクルードさせていたのでコピーペーストし、 createthreadとしたのですが、(おそらく)「windows.hのようなファイルはない」のようなエラーが出ます。 Macではマルチスレッドは使用できないのでしょうか。 それともほかのやり方があるのでしょうか。 すいませんがご教示いただけると幸いです。 よろしくお願いします。

  • VC6でマルチスレッドorフォーク

    CとC++の両方でマルチスレッド?を書きたいのですが、何か簡単なサンプルはありますか? 最初は動作させて理解したいので、VC6で動作するものが知りたいです。 マルチスレッドやフォークなど概念が理解していないので、詳しく書かれている書籍などご存知の方教えてください。 難しくても構いません。数年後?には理解すると思います。(^^;

  • MS-VisualStudio 2003と2005(マルチスレッドのみ)の環境の違い

    MS-VisualStudio2003にて C,C++,FORTRAN混合言語ソースで開発したシミュレーションプログラム  ・混合言語(CをメインにC++,FORTRAN9.0含む)  ・ライブラリ指定(シングルスレッド、debugモード) を MS-VS2005にシフトしましたが計算結果の違いが結構出てくることで 悩んでいます(悩ましいことに、多少違ってくる) MS-VS2005環境は  ・ライブラリがマルチスレッド環境のみ  ・IntelFORTRANはVer9.10 の様ですが、弊方はこの環境を持っておらず、 環境設定などの詳細がわかないで困っています PC環境、プログラミングの問題、その他いろいろと考えられる 因子はありますが、弊方と同じような開発環境で悩んだ方で ・MS-VisualStudio開発環境(2003,2005) ・IntelFORTRAN環境 (9.0/9.1) 以上の大きな相違点など何かヒントでもあればありがたく 書き込みいただければ幸いです

専門家に質問してみよう