cmake没有使用boost多线程库

时间:2012-11-13 17:03:30

标签: c++ multithreading boost cmake

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})

我可以看到序列化过程只使用一个CPU核心(100%)而不使用其他CPU核心。并且ldd也没有显示-mt个库

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)

1 个答案:

答案 0 :(得分:4)

Boost Serialization旨在提供线程安全性,但不能通过线程进行并发序列化。

通过包管理器安装Boost时,您经常会在/usr/lib中找到库别名,这些库别名将库的更详细名称映射到规范库中。对于Boost,“标记”名称包含通过-mt后缀的多线程功能。

ldd仅显示CMake在调用链接器时使用的名称,该链接器是规范的,而不是具有*-mt后缀的详细链接器。因为Boost包安装涉及创建

形式的符号链接
/usr/lib/libboost_thread-mt.so -> libboost_thread.so.1.42.0

您不必担心链接的错误库。

实际上,Boost Serialization本身并不会产生线程,因此只使用该库就不会看到增加的线程数。在内部,序列化库使用互斥锁来保护共享指针的计数器。