并发 C++11 - 可以使用哪些工具链
Concurrent C++11 - Which toolchains can be used?
我在代码中大量使用<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的析构函数。
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- 如何将模板转换为C++11之前的模板
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- c++11评估顺序(未定义的行为)
- 参数化自定义CMake工具链
- C++中的VLA,扩展名为std=C++11
- 使用 OSX 和 Eclipse 获取有效的 C++11 工具链,而不会破坏某些内容
- 自动工具检查 C++11
- Mac 上的 Xcode 工具支持 c++11
- 并发 C++11 - 可以使用哪些工具链
- 对C++11标准的工具链支持
- 具有自动工具的CDT中的C++11
- 如何使用c++ 11语言环境工具来使用UTF-8作为字符串的内部表示
- 如何使用DirectX 11与Visual Studio 2015工具集v140在Windows 7
- 无法使用 GCC 5.1 工具链编译 C++11 源代码