Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

使用和构建库

配置
限制

Boost.Thread 按照用于构建具有独立源代码的库的约定进行配置。 只有当用户明确要求时,Boost.Thread 才会导入/导出代码,方法是定义 BOOST_ALL_DYN_LINK(如果他们希望所有 Boost 库都动态链接)或 BOOST_THREAD_DYN_LINK(如果他们只希望这个库动态链接)。

这些宏的定义决定了是否定义了 BOOST_THREAD_USE_DLL。 如果未定义 BOOST_THREAD_USE_DLL,则库将根据平台定义 BOOST_THREAD_USE_DLL 或 BOOST_THREAD_USE_LIB。 在非 Windows 平台上,如果未定义,则定义 BOOST_THREAD_USE_LIB。 在 Windows 平台上,如果 BOOST_THREAD_USE_DLL 并且编译器支持使用 Boost.Threads 进行自动 tss 清理(目前为 Msvc 和 Intel),则定义 BOOST_THREAD_USE_LIB。

构建库时编译的源代码定义了一个宏 BOOST_THREAD_SOURCE,用于导入或导出它。 在任何情况下,用户都不得定义此宏。

Boost.Thread 依赖于一些非仅标头库。

似乎有些 IDE(例如 Visual Studio)会通过检查源代码来推断程序需要链接的库。 这样的 IDE 可能会强制链接到 Boost.DateTime 和/或 Boost.Chrono。

由于唯一的强制性依赖项是 Boost.System,因此以下命令

bjam toolset=msvc-11.0 --build-type=complete --with-thread

将仅安装 boost_thread 和 boost_system。

此类 IDE 的用户应使用以下命令强制构建 Boost.Chrono 和 Boost.DateTime

bjam toolset=msvc-11.0 --build-type=complete --with-thread --with-chrono --with-date_time

以下部分描述了用于配置 Boost.Thread 的所有宏。

表 37.1. 可配置功能的默认值

功能

反功能

V2

V3

V4

V5

USES_CHRONO

DONT_USE_CHRONO

是/否

是/否

是/否

是/否

PROVIDES_INTERRUPTIONS

DONT_PROVIDE_INTERRUPTIONS

THROW_IF_PRECONDITION_NOT_SATISFIED

-

PROVIDES_PROMISE_LAZY

DONT_PROVIDE_PROMISE_LAZY

PROVIDES_BASIC_THREAD_ID

DONT_PROVIDE_BASIC_THREAD_ID

PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN

DONT_PROVIDE_GENERIC_SHARED_MUTEX_ON_WIN

PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION

DONT_PROVIDE_SHARED_MUTEX_UPWARDS_CONVERSION

PROVIDES_EXECUTORS

-

PROVIDES_EXPLICIT_LOCK_CONVERSION

DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION

PROVIDES_FUTURE

DONT_PROVIDE_FUTURE

PROVIDES_FUTURE_CTOR_ALLOCATORS

DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE

DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE

PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE

DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE

PROVIDES_ONCE_CXX11

DONT_PROVIDE_ONCE_CXX11

USES_MOVE

DONT_USE_MOVE

USES_DATETIME

DONT_USE_DATETIME

是/否

是/否

是/否

是/否

PROVIDES_THREAD_EQ

DONT_PROVIDE_THREAD_EQ

PROVIDES_CONDITION

DONT_PROVIDE_CONDITION

PROVIDES_NESTED_LOCKS

DONT_PROVIDE_NESTED_LOCKS

PROVIDES_SIGNATURE_PACKAGED_TASK

DONT_PROVIDE_SIGNATURE_PACKAGED_TASK

PROVIDES_FUTURE_INVALID_AFTER_GET

DONT_PROVIDE_FUTURE_INVALID_AFTER_GET

PROVIDES_VARIADIC_THREAD

DONT_PROVIDE_VARIADIC_THREAD

C++11

C++11


默认情况下,Boost.Thread 使用 Boost.Chrono 进行与时间相关的函数,如果未定义 BOOST_THREAD_DONT_USE_CHRONO,则定义 BOOST_THREAD_USES_CHRONO。 对于与 Boost.Chrono 配合不佳的编译器,用户应定义 BOOST_THREAD_DONT_USE_CHRONO

[Warning] 警告

当定义 BOOST_THREAD_PLATFORM_WIN32 时,无论用户设置如何,都会定义 BOOST_THREAD_USES_CHRONO。

默认情况下,Boost.Thread 使用内部移动语义实现。 从 3.0.0 版本开始,您可以使用 Boost.Move 提供的移动仿真。

BOOST_THREAD_VERSION==2 时,如果您想使用 Boost.Move 接口,请定义 BOOST_THREAD_USES_MOVE 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想使用 Boost.Move 接口,请定义 BOOST_THREAD_DONT_USE_MOVE

Boost 1.35.0 中引入的与时间相关的 Boost.DateTime 函数(使用Boost.Date_Time 库)已弃用。 这些包括(但不限于)

BOOST_THREAD_VERSION<=3 && 定义了 BOOST_THREAD_PLATFORM_PTHREAD 时,如果您不想使用与 Boost.DateTime 相关的接口,请定义 BOOST_THREAD_DONT_USE_DATETIME。 当 BOOST_THREAD_VERSION>3 && 定义了 BOOST_THREAD_PLATFORM_PTHREAD 时,如果您想使用与 Boost.DateTime 相关的接口,请定义 BOOST_THREAD_USES_DATETIME

[Warning] 警告

当定义 BOOST_THREAD_PLATFORM_WIN32 时,无论用户设置如何,都会定义 BOOST_THREAD_USES_DATETIME。

默认情况下,Boost.Thread 在 POSIX 平台上使用 Boost.Atomic 来实现 call_once。

如果您想使用 Boost.Atomic,请定义 BOOST_THREAD_USES_ATOMIC 。 如果您不想使用 Boost.Atomic 或您的平台不支持它,请定义 BOOST_THREAD_DONT_USE_ATOMIC

以下运算符已弃用

  • boost::thread::operator==
  • boost::thread::operator!=

当定义 BOOST_THREAD_PROVIDES_THREAD_EQ 时,Boost.Thread 提供这些已弃用的功能。

请改用

  • boost::thread::id::operator==
  • boost::thread::id::operator!=
[Warning] 警告

这是相对于 1.x 版本的重大更改。

BOOST_THREAD_VERSION>=4 时,如果您想要此功能,请定义 BOOST_THREAD_PROVIDES_THREAD_EQ 。 当 BOOST_THREAD_VERSION<4 时,如果您不想要此功能,请定义 BOOST_THREAD_DONT_PROVIDE_THREAD_EQ

boost::condition 已弃用。 当定义 BOOST_THREAD_PROVIDES_CONDITION 时,Boost.Thread 提供此已弃用的功能。

请改用 boost::condition_variable_any

[Warning] 警告

这是相对于 1.x 版本的重大更改。

BOOST_THREAD_VERSION>3 时,如果您想要此功能,请定义 BOOST_THREAD_PROVIDES_CONDITION。 当 BOOST_THREAD_VERSION<=3 时,如果您不想要此功能,请定义 BOOST_THREAD_DONT_PROVIDE_CONDITION

以下嵌套 typedef 已弃用

  • boost::mutex::scoped_lock,
  • boost::mutex::scoped_try_lock,
  • boost::timed_mutex::scoped_lock
  • boost::timed_mutex::scoped_try_lock
  • boost::timed_mutex::timed_scoped_timed_lock
  • boost::recursive_mutex::scoped_lock,
  • boost::recursive_mutex::scoped_try_lock,
  • boost::recursive_timed_mutex::scoped_lock
  • boost::recursive_timed_mutex::scoped_try_lock
  • boost::recursive_timed_mutex::timed_scoped_timed_lock

当定义 BOOST_THREAD_PROVIDES_NESTED_LOCKS 时,Boost.Thread 提供这些已弃用的功能。

请改用 * boost::unique_lock<boost::mutex>, * boost::unique_lock<boost::mutex>try_to_lock_t 构造函数, * boost::unique_lock<boost::timed_mutex> * boost::unique_lock<boost::timed_mutex>try_to_lock_t 构造函数 * boost::unique_lock<boost::timed_mutex> * boost::unique_lock<boost::recursive_mutex>, * boost::unique_lock<boost::recursive_mutex>try_to_lock_t 构造函数, * boost::unique_lock<boost::recursive_timed_mutex> * boost::unique_lock<boost::recursive_timed_mutex>try_to_lock_t 构造函数 * boost::unique_lock<boost::recursive_timed_mutex>

[Warning] 警告

这是相对于 1.x 版本的重大更改。

BOOST_THREAD_VERSION>=4 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_NESTED_LOCKS。 当 BOOST_THREAD_VERSION<4 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_NESTED_LOCKS

默认情况下,Boost.Thread 在基于 Posix 的系统上使用基于 pthread 类型的 thread::id (BOOST_THREAD_PROVIDES_BASIC_THREAD_ID)。 为了向后兼容以及为了与此修改配合不佳的编译器,用户可以定义 BOOST_THREAD_DONT_PROVIDE_BASIC_THREAD_ID

如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_BASIC_THREAD_ID

Windows 平台上的共享互斥锁实现目前提供的功能比用于基于 PTheads 的平台的通用实现少。 为了访问这些功能,用户需要定义 BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN 以使用通用实现,虽然效率可能较低,但提供了所有功能。

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_GENERIC_SHARED_MUTEX_ON_WIN

Boost.Threads 版本 3 包含 共享锁定中定义的共享锁定向上转换。 需要谨慎使用这些转换以避免死锁或活锁。 用户需要显式定义 BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS 才能获得这些向上转换。

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_SHARED_MUTEX_UPWARDS_CONVERSION

共享锁定中,锁转换是显式的。 由于此显式转换破坏了锁接口,因此仅当定义了 BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION 时才提供。

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION 。 当 BOOST_THREAD_VERSION==3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION

C++11 使用 std::future。 3.0.0 之前的 Boost.Thread 版本使用 boost:unique_future。 从 3.0.0 版本开始,当定义 BOOST_THREAD_PROVIDES_FUTURE 时,boost::future 替换 boost::unique_future。 然而,文档不再包含 boost::unique_future

BOOST_THREAD_VERSION==2 时,如果您想使用 boost::future,请定义 BOOST_THREAD_PROVIDES_FUTURE。 当 BOOST_THREAD_VERSION>=3 时,如果您想使用 boost::unique_future,请定义 BOOST_THREAD_DONT_PROVIDE_FUTURE

C++11 promise 在构造时初始化关联状态。 3.0.0 之前的 Boost.Thread 版本在需要此关联状态的任何时间点延迟初始化它。

从 3.0.0 版本开始,可以配置此行为差异。 当定义 BOOST_THREAD_PROVIDES_PROMISE_LAZY 时,提供向后兼容的行为。

BOOST_THREAD_VERSION==2 时,如果您想使用 boost::future,请定义 BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY 。 当 BOOST_THREAD_VERSION>=3 时,如果您想使用 boost::unique_future,请定义 BOOST_THREAD_PROVIDES_PROMISE_LAZY

C++11 std::promise 提供带有分配器的构造函数。

template <typename R>
class promise
{
  public:
    template <class Allocator>
    explicit promise(allocator_arg_t, Allocator a);
  // ...
};
template <class R, class Alloc> struct uses_allocator<promise<R>,Alloc>: true_type {};

其中

struct allocator_arg_t { };
constexpr allocator_arg_t allocator_arg = allocator_arg_t();

template <class T, class Alloc> struct uses_allocator;

从 3.0.0 版本开始,Boost.Thread 使用以下接口实现此构造函数

namespace boost
{
  typedef container::allocator_arg_t allocator_arg_t;
  constexpr allocator_arg_t allocator_arg = {};

  namespace container
  {
    template <class R, class Alloc>
    struct uses_allocator<promise<R>,Alloc>: true_type {};
  }
  template <class T, class Alloc>
  struct uses_allocator : public container::uses_allocator<T, Alloc> {};
}

这引入了对 Boost.Container 的依赖。 仅当定义了 BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS 时才提供此功能。

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

C++11 对于线程析构函数和移动赋值具有不同的语义。 如果线程可连接,则调用 terminate() 而不是分离线程。 当定义 BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLEBOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE 时,Boost.Thread 提供 C++ 语义。

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE 。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE

C++11 为 once_flag 定义了一个默认构造函数。 当定义 BOOST_THREAD_PROVIDES_ONCE_CXX11 时,Boost.Thread 提供此 C++ 语义。 在这种情况下,不支持以前的聚合语法。

boost::once_flag once = BOOST_ONCE_INIT;

您现在应该只执行

boost::once_flag once;

BOOST_THREAD_VERSION==2 时,如果您想要这些功能,请定义 BOOST_THREAD_PROVIDES_ONCE_CXX11。 当 BOOST_THREAD_VERSION>=3 时,如果您不想要这些功能,请定义 BOOST_THREAD_DONT_PROVIDE_ONCE_CXX11

C++11 packaged task 类具有 Signature 模板参数。 当定义 BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK 时,Boost.Thread 提供此 C++ 功能。

[Warning] 警告

这是相对于 3.x 版本的重大更改。

BOOST_THREAD_VERSION<4 时,如果您想要此功能,请定义 BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK。 当 BOOST_THREAD_VERSION>=4 时,如果您不想要此功能,请定义 BOOST_THREAD_DONT_PROVIDE_SIGNATURE_PACKAGED_TASK

C++11 线程构造函数接受可变数量的右值参数。 当定义 BOOST_THREAD_PROVIDES_VARIADIC_THREAD 时,如果未定义以下内容,则 Boost.Thread 提供此 C++ 功能

  • BOOST_NO_SFINAE_EXPR
  • BOOST_NO_CXX11_VARIADIC_TEMPLATES
  • BOOST_NO_CXX11_DECLTYPE
  • BOOST_NO_CXX11_DECLTYPE_N3276
  • BOOST_NO_CXX11_RVALUE_REFERENCES
  • BOOST_NO_CXX11_TRAILING_RESULT_TYPES
  • BOOST_NO_CXX11_RVALUE_REFERENCES
  • BOOST_NO_CXX11_HDR_TUPLE

BOOST_THREAD_VERSION>4 时,如果您不想要此功能,请定义 BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD

C++11 future<>::get() 在获取其值后使 future 无效。 当定义 BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET 时,Boost.Thread 提供此 C++ 功能。

[Warning] 警告

这是相对于 3.x 版本的重大更改。

BOOST_THREAD_VERSION<4 时,如果您想要此功能,请定义 BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET。 当 BOOST_THREAD_VERSION>=4 时,如果您不想要此功能,请定义 BOOST_THREAD_DONT_PROVIDE_FUTURE_INVALID_AFTER_GET

线程中断虽然有用,但会使任何中断点效率低于线程不可中断的情况。

当定义 BOOST_THREAD_PROVIDES_INTERRUPTIONS 时,Boost.Thread 提供中断。 当定义 BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS 时,Boost.Thread 不提供中断。

Boost.Thread 定义 BOOST_THREAD_PROVIDES_INTERRUPTIONS,如果既未定义 BOOST_THREAD_PROVIDES_INTERRUPTIONS 也未定义 BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS,以便不存在兼容性中断。

BOOST_THREAD_VERSION 定义 Boost.Thread 版本。 默认版本为 2。在这种情况下,如果未请求相反的情况,则定义以下中断或扩展宏

  • BOOST_THREAD_PROVIDES_PROMISE_LAZY

用户可以通过将 BOOST_THREAD_VERSION 定义为 3 来请求版本 3。 在这种情况下,如果未请求相反的情况,则定义以下中断或扩展宏

  • 重大更改 BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
  • 一致性与重大更改 BOOST_THREAD_PROVIDES_FUTURE
  • 统一性 BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
  • 扩展 BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
  • 一致性 BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
  • 一致性与重大更改 BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
  • 一致性与重大更改 BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
  • 一致性与重大更改 BOOST_THREAD_PROVIDES_ONCE_CXX11
  • 重大更改 BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY

用户可以通过将 BOOST_THREAD_VERSION 定义为 4 来请求版本 4。 在这种情况下,如果未请求相反的情况,则定义以下中断或扩展宏

  • 一致性与重大更改 BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
  • 一致性与重大更改 BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET
  • 一致性 BOOST_THREAD_PROVIDES_VARIADIC_THREAD
  • 重大更改 BOOST_THREAD_DONT_PROVIDE_THREAD_EQ
  • 重大更改 BOOST_THREAD_DONT_USE_DATETIME

某些编译器在某些新增功能上无法正常工作。

如果 __SUNPRO_CC < 0x5100,则库定义

  • BOOST_THREAD_DONT_USE_MOVE

如果 __SUNPRO_CC < 0x5100,则库定义

  • BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

如果 __IBMCPP__ < 1100,则库定义

  • BOOST_THREAD_DONT_USE_CHRONO
  • BOOST_THREAD_USES_DATE

并且 Boost.Thread 不与 Boost.Chrono 链接。

如果 _WIN32_WCE && _WIN32_WCE==0x501,则库定义

  • BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

PrevUpHomeNext