【问题标题】:Concurrent C++11 - Which toolchains can be used?并发 C++11 - 可以使用哪些工具链?
【发布时间】:2012-04-20 19:11:30
【问题描述】:

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

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

现在,如果其他人只是缺少包含 c++ 11 并发特性的库,我可以轻松使用 just::thread,但是 clang 和 gcc 都对 c++11 内存模型回答“否”,至少视觉 c++ 似乎支持。我不确定这会产生什么影响 - 可能会优化明显无副作用的代码,以及其他错误。

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

【问题讨论】:

  • 我的直接猜测是,如果您使用just::thread,它会正常工作。它使用本机(Posix 或 Win32)原语来强制执行诸如排序之类的事情,所以我认为编译器通常必须被严重破坏才能失败。
  • 你可能应该在你的列表中包含一个多线程相关的标签,Anthony Williams 经常出现在这里,所以如果你足够幸运他会注意到的。我认为他创建了just::thread 以便它是跨平台的,所以我预计不会有任何问题。

标签: c++ multithreading synchronization c++11 lock-free


【解决方案1】:

GCC 4.7 status

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

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

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

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

【讨论】:

  • 这看起来很有希望。我实际上倾向于 clang,因为它似乎会产生更多有用的错误消息——这对我来说是与 c++ 的大量时间同步。有一个实验性的 QtCreator,它使用 clang 来实现代码模型(完成、突出显示、重构等)。我将尝试一下,因为我真的很想念我在 linux 上的 Visual Studio + Visual Assist x。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2021-05-10
    • 2012-09-22
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多