• 締切済み

STLをマルチスレッドで使いたい

STL(のようなもの)をマルチスレッドで使いたいと考えています。 STL自体はスレッドセーフじゃないとのことですが、 変わりのライブラリとか無いのでしょうか? こんなの使ったよとか、こういうやり方したよとか、あれば教えてください。 言語:C++ 環境は何でもいいです。

  • darum
  • お礼率38% (7/18)

みんなの回答

回答No.3

> 商用利用可能な環境でないとちょっと難しいです。 Intel TBBは商用版もあります。

参考URL:
http://www.xlsoft.com/jp/products/intel/perflib/tbb/index.html
回答No.2

> 複数のスレッドが同じコンテナに同時アクセスしてしまう可能性があるなら、 > クリティカルセクションで対応できますし、 > スレッド同士のコンテナ操作のタイミングを調整したい場合には、ミューテックスなどが使えると思います。 とはいえ要注意。 コンテナを複数のスレッドでアクセスするとき、一方が取得したイテレータを他方の操作で無効にしてしまうことがあります。クリティカルセクション/ミューテックス等でこれ(イテレータの無効化)を抑止することはできません。 > また、環境は何でもいい、ということならインテルのTBBを使用する方法もあります。 > ・スレッドセーフとインテルTBBのコンテナ > http://codezine.jp/article/detail/4861 この記事を鵜呑みにしないこと。 コメントに記事の欠陥が指摘されています。 本家 http://threadingbuildingblocks.org/ にあるドキュメントを一読することをお薦めします。

noname#136000
noname#136000
回答No.1

クリティカルセクションやミューテックスを使用してみては? 複数のスレッドが同じコンテナに同時アクセスしてしまう可能性があるなら、 クリティカルセクションで対応できますし、 スレッド同士のコンテナ操作のタイミングを調整したい場合には、ミューテックスなどが使えると思います。 また、環境は何でもいい、ということならインテルのTBBを使用する方法もあります。 ・スレッドセーフとインテルTBBのコンテナ http://codezine.jp/article/detail/4861 参考にしてみて下さい。

darum
質問者

補足

すみません。説明が不足していました。 商用利用可能な環境でないとちょっと難しいです。 よろしくお願いいたします。

関連するQ&A

  • StringBuilderのマルチスレッド

    StringBuilderとStringBufferの使い分けについて教えてください。 StringBuilderの方がアクセスが早いが、スレッドセーフではないので、 マルチスレッド環境ではStringBufferを使わないといけないと思います。 マルチスレッド環境で、新しくインスタンスを作り、その中でStringBufferを使う分には 大丈夫なのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • メンバ関数(メソッド)をマルチスレッドにしたい

    環境はWinXPでVisual Studio 2005を使用しています。 C言語で関数をマルチスレッド化するにはこんな感じでOKでした。 // マルチスレッド関数 void Thread( void * ) { } void MainFunc() {   (HANDLE)_beginthread( Thread, 0, NULL ); } こんな風にスレッド関数をC++のメソッドに変えてうまくいくかと思い class Test_c { public:   void Thread( void * ); } ; // マルチスレッド関数 void Test_c::Thread( void * ) { } void MainFunc() {   Test_c t t;   (HANDLE)_beginthread( t.Thread, 0, NULL ); } とするとエラーが出てきてしまい、コンパイルが通りませんでした。 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に処理を奪い取られるのでしょうか

  • マルチスレッドと変数

    マルチスレッドのプログラムを組んでいます。 そこで、複数のスレッドからアクセスする変数があるのですが、これの扱いについて解らないことがあります。 ・変数を複数のスレッドから書き換える場合は、予想していた結果と違うことになる。 ここまではいいのですが、 ・変数を複数のスレッドから、参照だけするのは問題ない。 ・変数を複数のスレッドから、参照し、書き換えるのはひとつのスレッドだけならば、問題はない。 (上の"変数"は全て、Lockをかけていない状態です。) という認識をもっているのですが、これは間違いなのでしょうか? 「参照だけならばLockはかけなくてよい」というのをどこかで読んだような覚えがあり、そのまま勝手に最後の推測をしています。 現状ではうまくいっているようなのですが、とても不安です。 もしくは、状況、環境、コーディングによって上の仮定は成立したり、成立しなかったりするのでしょうか?環境はC#ですが、もしどのような言語、環境であっても一般的に、同じような結果になるのなら、それも合わせてご教授お願いします。

  • 古いマルチスレッドプログラムはマルチコアに対応しているのか

    Windows上での話という事でお願いいたします。 HTが出始めた頃の高級言語C++やDelphi等で作成した、マルチスレッドプログラムは、そのままでマルチコアに対応しているのでしょうか? 多くの記事やネット上の情報およびインテルのQuad coreのプロモーションを見る限り、プログラムがマルチスレッドならば、そのままマルチコアを有効に利用できるような事が書いてありますが、プログラミングにおいて、特別にマルチコアに対応するようなコードは必要ないのでしょうか? C#用のQuad Core対応といったようなライブラリもあり、特別な処理が必要なのではという雰囲気がただよっているのですが・・・。 (ライブラリのソースまで見れたわけではないので、実態がよくわからない) Quad Core対応のライブラリというのは、いったい何をしていると予想されますでしょうか。 4スレッドで動く事を前提に最適化されているだけなのでしょうか。 といった疑問なのですが、お暇がありましたら ご回答いただければ幸いです。

  • マルチスレッド化。

    今とても大きな配列を使用し、長時間処理をするプログラムを組んでいます。元々処理時間に1時間を要するプログラムを2分で処理を完了するまでに仕上げました。 しかし、探究心はおさまらずもう少し高速化に挑みたいと考えています。 過去に「猫でもわかる」のSDK第1章と2章を学び、マルチスレッドのプログラムをSDKで組んだことがあります。それを利用してマルチスレッド化を実現したいと考えています。 言語はCでVisualStudio2005を使用しています。 *疑問1   SDKの場合WinMain関数とプロシージャからの実行で_beginthread関数を記述すれば処理が開始されます。 Cでもmain関数内に記述すれば、SDKと同様に処理できるのでしょうか? *疑問2 _beginthread関数の引数に関してです。 第1引数にvoid型のスレッド関数、第2引数に0?、そして第3引数にはスレッド関数に渡すデータの引数を記述すると把握しているのですが、渡したいデータは複数あり、***型と**型、それに変数を数個とスレッド関数に渡したいデータだらけなのですが、どのように記述すればよいでしょう? *疑問3 2つのスレッドを作成しようと考えていますが、その2つのスレッドで1つの大きな配列を共有して処理したいと考えています。 そのため、スレッド間の同期が必要になるわけですが同期の種類にもクリティカルセクションやミューテックス、イベントと豊富でどれを使用すれば良いのか迷ってしまいます。厳密に同期を取り処理をするにはイベントが一番良いと考えています。 これらの疑問に答えられる方はアドバイスをよろしくお願いします。

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

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

  • 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) 以上の大きな相違点など何かヒントでもあればありがたく 書き込みいただければ幸いです

  • ATLとSTLの違いは何でしょうか?

    ATLとSTLの違いは何でしょうか? STLでもリスト構造(線形リスト、[双方向リスト]) #include <list>があるみたいですが・・・ STLはC++の標準テンプレートライブラリ(そのまま)と理解しています。 あと、ActiveXとALTの違いも知りたいです。 極論しますが、ActiveXとはOCXを作ることでしょうか?

  • マルチスレッドの実装について

    只今、数冊の本を読み、現在マルチスレッドの部分を やっているのですが、 参考本AとBには class Sample extends Thread { というやり方が書いてあり、 参考本Cには class Sample implements Runnable { というやり方だけ書いてあります。 どういう事だと思い、クラスリファレンス本を読んでみると、 『マルチスレッドプログラミングを行う際にはthreadを継承するか、Runnableインターフェイスを実装します』 とだけ記述されていました。 参考本AとBは2002年に発行・改訂されており、「extends Thread」の説明しか載っていませんでした。 参考本Cは2000年発行で改訂はされていません。 Q:この2つは使い分けのようなものがあるのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう