16

我愿意从并发中学习更多,我发现这本书有很多好评。但是看了前言,恐怕它非常关注仅包含在 C++11 中的 STD 函数。

由于 C++11 还不是很常用,而且在我的工作场所根本没有,我需要知道在我应该阅读另一本书时阅读这本书是否会浪费时间。

我专注于 Windows 开发,但我喜欢在 UNIX 和 Windows 中使用标准库。对这本书有什么建议或说明吗?

4

6 回答 6

14

不,本书大量使用 C++11 语法。

书中讨论的东西也不仅仅是 C++11 库特性,例如 C++11 内存模型是 C++11 中的一个全新事物(c++98 不承认 MT 的存在)。

仍然恕我直言,您应该从以下位置获得超级容易安装的 g++4.9+boost:nuwen.net 或者只是获得 VS 2013 社区。

因为 C++11 是标准,我猜你很快就会开始在你的工作场所使用它(如果不是引用 Andrei Alexandrescu 的话:“打电话给你的猎头!”)。顺便说一句std::threadboost::thread它们非常相似,但有显着差异。

于 2012-08-30T08:05:32.973 回答
6

你说得对,它主要关注 C++11。正如副标题所暗示的那样,它是“实用的多线程”。

如果您不使用 C++11,您可能会感兴趣的唯一方法是您计划使用 boost 线程,这是 C++11 线程的基础。但是你必须知道它们并不完全相同,因为 C++11 做了一些改变。(例如,在 C++11 中,您必须决定是等待线程完成还是让它自行运行。在 boost 中,默认情况下它会自行运行。如果您不在 C++11 中选择,您的程序将终止)。

然后,对于您作为对其领域感兴趣的 C++ 开发人员的一般知识,推荐阅读。C++11 书籍目前还不是很多。

于 2012-08-30T08:05:24.830 回答
4

自从

  • 你正在寻找一本关于并发阅读的书
  • 你想使用一个可以在 windows 和 unix 上运行的库
  • 你想使用 C++ 但不是 C++11

您可能需要使用 Boost.Thread。

那时你会读这本书有一些原因:

  • 我不知道关于 Boost 线程的书
  • 本书作者多年来一直是 Boost.Thread 的主要开发者和维护者
  • C++11 线程很像 Boost 线程(作者写道:“本书中的大多数示例都可以修改为与 Boost 线程库一起使用,方法是明智地将 std:: 替换为 boost:: 并使用适当的#include 指令。”)
于 2012-09-23T06:35:43.970 回答
4

将在整整两周后发布的下一代 Visual C++ 包含std::thread库,如果我没记错的话,G++ 已经包含库了。我不会把它算在内。事情是这样的:C++11 真的非常重要。如果您的工作场所不打算迁移,我会寻找另一个工作场所。

于 2012-08-30T08:07:07.690 回答
2

我认为即使您不了解多线程的东西,这也是一本非常有趣的书。就像在一个结构中创建两个互斥锁一样,当您从两个内核切换到两个处理器时会出现问题。还有很多设计模式。从这本书中,您将通过示例了解什么是 ABA 问题等。此外,boost 线程(不需要 c++11x)与 c++11 线程非常相似。你会坚持使用 smart_ptrs,也许是 sink 模式,RAII 等等。这是一本很棒的书。

请注意,即使现​​在并非所有功能都在示例 G++ 中实现。http://gcc.gnu.org/projects/cxx0x.html

老实说,您肯定会开始学习新的 c++,但您何时必须接触它只是时间问题。

于 2012-08-30T08:17:16.567 回答
0

我没有读过这本书,但是如果你对并发不清楚,那么首先要做的是阅读、使用和理解一个多线程系统。

然后对另一个系统执行相同的操作,并仔细注意与您已经知道的系统的差异。当您发现差异时,请开始阅读以了解许多不同的系统如何处理该方面的并发性。

如果您目前正在开发多线程程序,那么您研究的第一个系统应该是您主要工作的系统,因为在您了解该系统的并发模型之前,您可能会破坏事物和/或编程复制和粘贴现有代码。所以这很可能是 Windows、pthreads、Boost、TBB 或其他已经存在的东西。不过,C++11 可能是第二个系统的有力候选者。

否则,我认为你先学习哪一个不会有太大的不同。好的 C++11 有一个小小的缺点,它除了 PDF 之外还不存在——你必须安装一些仍在快速开发中的编译器版本,并且可能std::thread暂时使用 Boost 线程,并且也许书中的一些代码示例无法编译,您必须解决缺少的功能。所以不要在你的工作场所尝试书中关于生产代码的实验(我的意思是,你无论如何都不会,对吧?)。

老实说,别管 C++,学习Java并发模型仍然是理解并发的合理起点。或者 Go:它有一些非常好的抽象,要花半天时间才能理解它的要点,它会告诉你应该如何并发程序工作,假设没有丑陋的复杂性迫使你这样做。当然,您不会立即在您的专业 C++ 工作中使用 Java、Go 或 C++11 中的所有知识,但它可能仍然值得拥有。

于 2012-08-30T08:48:52.450 回答