2011-12-22 10 views
1

現在、STDライブラリとブーストライブラリの両方を含むbookを読んでいます。問題は、Visual Studio 2010がまだSTDスレッドをサポートしていないことと、ブーストライブラリに依存しなければならないことです。ライブラリを追加するためのstdライブラリのマッピング

私はstdスレッドライブラリとブーストライブラリの間に1対1のマッピングを探しています。参考にしているリソースがありますか?例えば

std::mutex 
std::thread 
std::lock_guard 
std::unique_ptr 
std::move 
std::thread::hardware_concurrency() 
std::thread::id 
std::this_thread 
std::shared_ptr   => boost::shared_ptr 
+0

私はインテルスレッディングビルディングブロックを見ています。スレッディングなどに非常に高いレベルのインターフェイスを提供しています。また、C++ 11ラムダも非常にうまくいきます。 – smerlin

+1

@smerlin:問題は、TBBは 'std :: thread'とは非常に違うが、' boost :: thread'はほとんど同じです。私は、OPが、 'std :: thread'の知識をできるだけ直接別のライブラリに適用する方法を知りたいと思っています。 – ildjarn

+0

@ildjarn:ええ、私は気づいたことがあります。TBBについて言及したかったのは、問題を最初に解決するために、より高度なアプローチを使用する方が良いということです。アプローチが高レベルであるためにそれがうまくいかない場合でも、低レベルのエリアで掘削を開始することができます。 TBBは非常に使いやすく、オープンソースであり、学術目的で無料です。 – smerlin

答えて

2

あなたは、あなたが自由のためにVC++11 Developer Previewを使用することができることを知っていますMSVC 2010年に

std::movestd::unique_ptrstd::shared_ptrを使用できますか?そしてそこにSTL同期オブジェクトを使用することができます。 (Is it smart to replace boost::thread and boost::mutex with c++11 equivalents?

+0

プロジェクトでは、VS 2010のみを使用できます。 – q0987

+0

AFAIK Bartoscz Milewskiは 'std :: thread'と関連クラスの実装に' just :: thread'ライブラリを使用しています(http://www.stdthread.co.uk/ )。 – smerlin

+0

@smerlin:はい、こんにちは。しかし、私はMilewskiのウェビナーでプレーンVC++ 11を使用していますが、それでも正常に動作します。 VC++ 11とC++ 11の間には[違い](http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx)があります。 –

2

ブーストスレッドライブラリが標準スレッドライブラリに非常に似て、次の質問にされた同時実行

程度Bartocz Milewskiのwebinarsを見てあなたはboost::mutexの比較を見ることができ、boost::threadstd::mutexstd::threadブーストライブラリに基づいて)。 Boostではこれからもすべてが同じであると思います(mutexthreadlock_guardthread::hardware_concurrency()thread::id)。

残りのものはスレッドライブラリの一部ではありません。たとえそれがそのライブラリを持っていなくても、あなたのコンパイラはそれらを持っているでしょう。

boost::moveの実装がありますが、それらがstd::moveのように動作するかどうかはわかりません。コンパイラがサポートしている場合は使用する必要があります。

boost::unique_ptrはありません。あなたはおそらくでそれをエミュレートし、std::swap(おそらくはboost::move)を使って移動をエミュレートすることができます。

boost::shared_ptrは、std::shared_ptrと非常によく似ています。

+0

これは私の心配です。両方のライブラリで2つの名前が同じであっても、同じ名前を実行するわけではありません。 – q0987

+0

stdネームスペースに入力されたブースト機能は完全に同等ではありません。C++ 11のC++ 11が定義され、C++ 11用の新しいSTLが作成されたため、C++ 03用のboostが作成されました。 C++ 03とC++ 11は、異なるセマンティックメカニズムを提供します。hance std :: xは、元のboost :: xよりも強力です。 –

2

boost :: threadとクラスを関連付けることができます(boost.orgを見てください)。

boost :: threadはC++ 03で実装されていましたが、VS2010ではC++ 11コンパイラが提供されていました。 2つの言語は「機能」の点で異なり、ライブラリはC++ 11の機能よりもC++ 03のメリットを享受できます。

これにより、std :: shared_ptr(とstd :: unique_ptr)はboost :: shared_ptrとstd :: auto:_ptrを優先することができます。ここで、C++ 11の機能が利用できます。

MSがstd :: threadなどをサポートしていない理由(ただし、Windows版のGCC-MinGWでも同じです)は、std :: threadが古いC POSIXのpthread機能をラップしていますが、windows- POSIXの同等のシステムではなく、特定のプリミティブをサポートしていません(他にも提供していますが)。

MSはWin6(Vista)からPOSIX機能の同等のAPIを提供するように開始し、マッピング作業を可能にし、効果的にしました。 しかし、win5 +(XP/2 & 3)が依然として優勢である世界では、std :: threadはwin6 +以降しか利用できません。

現在、boost :: threadはC++ 11でstd :: threadになったもののC++ 03の模倣品であり、POSIX(Unix/Linux)とWindows。

+0

私は 'std :: thread'がwindows-xpに実装できないことを非常に疑っています。 'std :: thread'のどの機能がpthreads apiなしで効率的に実装できないのですか? – smerlin

+0

@スメリン:実際はそうです。 ウィンドウの問題は、condition_variableに対応する完全なネイティブオブジェクトがないことです。 Windowsイベント(CreateEventを参照)は、それを模倣することができますが、同じインスタンス(notify_oneとnotify_all)の両方を変換することはできません。 WindowsではC++の標準インタフェースを実装できますが、Posixシステムよりも複雑で(専用の)作業が必要です。これにより、Windowsプログラマは、POSIXのものを模倣するのではなく、Win32のネイティブオブジェクトをマッピングするC++ラッパーを好む傾向があります。しかし、これは異なるロジックを持つプログラムにつながります。 –

+0

はい、私はあなたのポイントを参照してください、しかし、私はまだstd :: thread'を実装するための機能が必要と信じていません。もちろん、効率的な 'std :: condition_variable'を実装することはできませんが、条件変数を使用せずにC++ 11の他のほとんどのマルチスレッド機能を実装することは可能です。 – smerlin

関連する問題