【问题标题】:std library mapping to boost librarystd 库映射到 boost 库
【发布时间】:2012-01-26 05:05:55
【问题描述】:

目前,我正在阅读book,其中包含 STD 库和 boost 库的用法。问题是 Visual Studio 2010 还不支持 STD 线程,我们必须依赖 boost 库。

因此,我正在寻找 std 线程库和 boost 库之间的一对一映射。有什么资源可以参考吗?

例如,

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

【问题讨论】:

  • 我想看看 Intel Threading Building Blocks,它为线程等提供了一个非常高级的接口,并且它与 C++11 lambdas 配合得也很好。
  • @smerlin :问题在于 TBB 与 std::thread 非常不同,但 boost::thread 大多相似。我认为 OP 想知道如何将他对std::thread 的知识尽可能直接地应用于替代库。
  • @ildjarn:是的,我注意到了,我只是想提一下 TBB,因为几乎总是最好先尝试使用更高级的方法来解决问题。如果因为方法是高级别而无法解决,您仍然可以开始在低级别区域进行挖掘。而且 TBB 非常易于使用、开源且免费用于学术目的。

标签: c++ visual-studio-2010 visual-c++ c++11 boost-thread


【解决方案1】:

Boost 线程库与标准线程库(基于 boost 库)非常相似;我认为 Boost 中的所有内容或多或少都相同,包括列表中的 mutexthreadlock_guardthread::hardware_concurrency()thread::id

剩下的东西不是线程库的一部分;也许你的编译器确实有它们,即使它没有那个库。

boost::move 的实现,但我不确定它们的行为是否像std::move - 如果你的编译器支持,你应该使用它。

我认为没有boost::unique_ptr。你也许可以用boost::scoped_ptr 来模拟它,用std::swap(或者boost::move)来模拟一个动作。

正如你所说,boost::shared_ptrstd::shared_ptr 非常相似。

【讨论】:

  • 这正是我所关心的。当两个库中的两个名称相同时,并不意味着它们的性能相同。
  • 进入 std 命名空间的 Boost 特性不完全等效:boost 是为 C++03 编写的,基于帽子经验 C++11 被定义,新的 STL 是为 C++ 编写的11. C++03 和 C++11 提供了不同的语义机制,hance std::x 比起源它的 boost::x 更强。
【解决方案2】:

您可以在 MSVC 2010 中使用 std::movestd::unique_ptrstd::shared_ptr

你知道你可以免费使用VC++11 Developer Preview吗?在那里你可以使用 STL 同步对象。看看 Bartocz Milewski 的 webinars 了解并发

您可以在以下问题Is it smart to replace boost::thread and boost::mutex with c++11 equivalents? 中查看boost::mutexboost::threadstd::mutexstd::thread 的比较

【讨论】:

  • 该项目只允许我使用VS 2010。
  • AFAIK Bartoscz Milewski 使用 just::thread 库来实现 std::thread 和相关类 (stdthread.co.uk)。
  • @smerlin:是的,你好。但是,我在 Milewski 的网络研讨会上使用了普通的 VC++11,它仍然可以正常工作。 VC++11和C++11之间有difference
【解决方案3】:

您可以查看 boost::thread 和相关类(只需查看 boost.org)。

但不要忘记它们并不完全等价: boost::thread 已经在 C++03 中实现,而 VS2010 提供了 C++11 编译器。 两种语言在“特性”方面有所不同,库从 C++11 特性中受益比 C++03 更多。

这使得 std::shared_ptr(和 std::unique_ptr)在 C++11 功能可用的地方比 boost::shared_ptr 和 std::auto:_ptr 更可取。

MS 不支持 std::thread 等的原因(但 Windows 版本的 GCC - MinGW 也是如此)是 std::thread 包装了旧的 C POSIX pthread 功能,但 windows -internally- 是不是 POSIX 等效系统并且不支持某些原语(尽管它提供了其他)。

MS 从 Win6 (Vista) 开始提供 POSIX 功能等效 API,从而使映射工作成为可能和有效。 但这使得 std::thread 在 win5+ (XP/2 & 3) 仍然占主导地位的世界中仅适用于 win6+。

现在,boost::thread 是 C++03 模仿 C++11 中的 std::thread,并且可用于 POSIX (Unix/ Linux) 和 Windows。

【讨论】:

  • 我非常怀疑 std::thread 不能在 windows-xp 上实现。没有pthreads api,std::thread 的哪些特性无法高效实现?
  • @smerlin:实际上是。 windows 的问题在于它没有与 condition_variable 完全等效的本地对象。 windows 事件(请参阅 CreateEvent)可以模仿它,但它不能在同一实例中同时转换 notify_one 和 notify_all。忘记 pthread,C++ 标准接口可以在 Windows 中实现,但需要比 Posix 系统更复杂(和专用)的工作。这使得 Windows 程序员更有可能更喜欢映射 Win32 本机对象的 C++ 包装器,而不是模仿 Posix 的包装器。但这会导致程序具有不同的逻辑。
  • 是的,我明白你的意思,但我仍然不相信你需要那个功能来实现高效的 std::thread. Of course they cant implement std::condition_variable`,但应该可以实现大多数其他不使用条件变量的 C++11 的多线程特性。
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多