12

threading=multiブーストを構築するときにフラグが正確に何をするのか完全にはわかりません。ドキュメントには次のように記載されています。

 Causes the produced binaries to be thread-safe. This requires proper
 support in the source code itself.

これはあまり具体的ではないようです。これは、たとえばブースト コンテナーへのアクセスが保護されていることを意味しますmutexes/locksか? 私のコードのパフォーマンスは重要であるため、不要なミューテックスなどを最小限に抑えたい.

詳細:

私のコードは、マルチスレッドのサードパーティ アプリケーションに読み込まれるプラグイン DLL です。Boost を DLL に静的にリンクします (プラグインは、標準の Windows DLL 以外の依存関係を持つことが許可されていないため、これを行う必要があります)。

アプリケーションはマルチスレッドですが、DLL 内のほとんどの関数は単一のスレッドからしか呼び出されないため、コンテナーへのアクセスを保護する必要はありません。複数のスレッドから呼び出すことができるコードの残りの場所は、boost::mutexand friends を使用して明示的に保護します。

私は両方threading=multiと両方でブーストを構築しようとしましthreading=singleたが、両方ともうまくいくようですが、ここで何をしているのか本当に知りたいです。

4

4 に答える 4

5

掘り下げた後、threading=single予想されるように、それはあまり効果がないことがわかりました。特に、BOOST_HAS_THREADSマクロには影響しないため、シングル スレッド環境を想定するようにライブラリを構成しません。

gccでは をthreading=multi 意味するだけですが#define BOOST_HAS_PTHREADS、MSVC では目に見える効果はありません。特に、はとモード_MTの両方で定義されます。threading=singlethreading=multi

ただし、BOOST_SP_DISABLE_THREADSBOOST_ASIO_DISABLE_THREADS、または を使用してグローバルに適切なマクロを定義することにより、シングル スレッド モード用に Boost ライブラリを明示的に構成できることに注意してくださいBOOST_DISABLE_THREADS

于 2014-01-08T09:34:42.147 に答える
2

簡潔にしましょう。異なるスレッドが異なる Boost オブジェクトを使用できるCauses the produced binaries to be thread-safeように Boost コードが適合されていることを意味します。これは特に、Boost コードが、Boost ライブラリの実装によって使用される可能性のある非表示のグローバル オブジェクトまたは静的オブジェクトへのアクセスのスレッド セーフに特別な注意を払うことを意味します。異なるスレッドが保護なしで同じ Boost オブジェクトを同時に使用することを自動的に許可しません(ロック/ミューテックス/...)。

編集:一部の Boost ライブラリでは、特定の関数またはクラスに対して追加のスレッド セーフが文書化されている場合があります。たとえばasio::io_service、コメントで Igor R. が提案したように。

于 2014-01-08T12:02:24.423 に答える
0

ドキュメントには、必要なすべてのことが書かれています。このオプションは、スレッドの安全性を保証します。つまり、マルチスレッド環境でプログラミングする場合、変数などへの無制限のアクセスを回避するなど、特定のプロパティを確保する必要があります。

このオプションを有効にすることが道だと思います。

詳細な参照:マルチスレッド対応モードの BOOST ライブラリ

于 2013-12-31T15:55:56.003 に答える