并发 C++11 - 可以使用哪些工具链

Concurrent C++11 - Which toolchains can be used?

本文关键字:工具 C++11 可以使 并发      更新时间:2023-10-16

我在代码中大量使用<thread> <atomic> <mutex>等,其中包括几个无锁算法。我的目标是(最终)Linux环境。我一直在使用Visual Studio 2011 Beta进行开发,虽然在其他C++11功能中非常缺乏,但它似乎是唯一实现并发功能的工具链。

在此处查看 c++ 11 支持:

  • 叮当 3+
  • 海湾合作委员会 4.7
  • MSVC 11

现在,如果其他人只是缺少包含 c++ 11 并发功能的库,我可以轻松使用 just::thread,但是 clang 和 gcc 都对 c++11 内存模型回答"否",至少 visual c++ 似乎支持。我不确定这样做的效果是什么 - 可能会优化明显无副作用的代码,以及其他错误的事情。

如果现在我完全避免优化构建并仅编译未启用优化的调试构建 - 使用 Clang 或 GCC 工具链是否合理?

海湾合作委员会 4.7 状态

C++内存模型工作正在进行中,并计划在 下一个 GCC 版本。GCC 4.7 现已发布,所以这就是您 可以从中期待。

  • 支持无锁指令的完整原子实现。所有原子操作都已使用新__atomic实现 内置,并且大多数目标在 生成的代码。优化不会移动共享内存 操作超过原子操作,因此会发生各种情况 关系受到尊重。
  • 当无锁指令不可用(通过硬件或操作系统支持)时,原子操作将保留为函数调用 由库解析。由于时间限制和 API 尚未最终确定,GCC 4.7 没有提供 libatomic。这是 通过遇到不满意的外部符号轻松确定 以 _atomic* 开头。
  • 如果程序需要库帮助,则可以编译单个 C 文件示例实现并将其与 客户端程序使用锁定的 实现。下载样本 libatomic
  • C++模板完全支持任意大小的对象,尽管前面提到的libatomic.c文件可能需要满足一些 用户定义的类。如果类映射到与支持的类相同的大小 无锁积分类型,那么也将使用无锁例程。
  • 位域与内存模型不兼容。也就是说,由于整个单词,他们可能会引入加载或存储数据竞争 读取或写入时访问。
  • 尽管已完成一些工作,但尚未对优化进行完全的合规性审核。某些优化可能会引入新数据 以前没有的比赛。已知病例数为 小,测试合规性并非易事。如果有人遇到 如果优化引入了新的数据竞争,请打开 Bugzilla案例,以便可以解决。

对LLVM的支持似乎更进一步:http://llvm.org/releases/3.0/docs/Atomics.html

不过,很难说这在叮当中实际使用到什么程度。似乎<atomic>基本上适用于某些类型。我得到了其他类型的编译器断言,说原子类型是意外的,这给它使用的类型带来了一些信心。

我已经在64位Linux和Windows上成功使用了gcc-4.7。 std::thread等在 Linux 上运行完美,即使使用 gcc-4.6。
在Windows gcc-4.7(mingw64)上有一些小问题,内存泄漏与std::condition_variable AFAIR的析构函数。