2

私は持っていますが、まだライブラリset(Boost_USE_MULTITHREADED ON) を使用していません。-mt

cmake_minimum_required(VERSION 2.6)
PROJECT(app)
set(Boost_USE_MULTITHREADED ON)
FIND_PACKAGE(Boost COMPONENTS filesystem program_options thread serialization REQUIRED)
ADD_EXECUTABLE(app long_list_of_files)
TARGET_LINK_LIBRARIES(app ${Boost_LIBRARIES})

シリアル化プロセスが 1 つの CPU コア (100%) のみを使用し、他のコアを使用していないことがわかります。-mtまた、lddはライブラリを表示しません

linux-gate.so.1 =>  (0xb781f000)
libboost_filesystem.so.1.42.0 => /usr/lib/libboost_filesystem.so.1.42.0 (0xb77e9000)
libboost_program_options.so.1.42.0 => /usr/lib/libboost_program_options.so.1.42.0 (0xb7795000)
libboost_thread.so.1.42.0 => /usr/lib/libboost_thread.so.1.42.0 (0xb7780000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7766000)
libboost_serialization.so.1.42.0 => /usr/lib/libboost_serialization.so.1.42.0 (0xb76f3000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7608000)
libm.so.6 => /lib/libm.so.6 (0xb75e2000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75c5000)
libc.so.6 => /lib/libc.so.6 (0xb7468000)
libboost_system.so.1.42.0 => /usr/lib/libboost_system.so.1.42.0 (0xb7463000)
librt.so.1 => /lib/librt.so.1 (0xb745a000)
/lib/ld-linux.so.2 (0xb7820000)
4

1 に答える 1

4

ブースト シリアライゼーションは、スレッド セーフを提供することを目的としていますが、スレッドを介した同時シリアライゼーションではありません。

パッケージ マネージャー経由で Boost をインストールする場合、ライブラリ/usr/libのより詳細な名前を正規の名前にマップするライブラリ エイリアスがよく見つかります。Boost の場合、「タグ付き」の名前には、接尾辞によるマルチスレッド機能が含まれ-mtます。

lddリンカーを呼び出したときに CMake によって使用された名前のみを表示します。これは正規のものであり、*-mt接尾辞が付いた冗長なものではありません。Boost パッケージのインストールには、次の形式のシンボリック リンクの作成が含まれていたためです。

/usr/lib/libboost_thread-mt.so -> libboost_thread.so.1.42.0

間違ったライブラリがリンクされていることを心配する必要はありません。

実際、Boost Serialization はそれ自体ではスレッドを生成しないため、ライブラリを使用するだけでスレッド数が増加することはありません。内部的には、シリアル化ライブラリはミューテックスを使用して共有ポインターのカウンターを保護します。

于 2012-11-13T18:13:21.717 に答える