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

时间:2012-04-07 15:41:26

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

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

请参阅此处的c ++ 11支持:

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

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

2 个答案:

答案 0 :(得分:4)

  

GCC 4.7 status

     

C ++内存模型工作正在进行中并计划在中完成   下一届GCC发布。 GCC 4.7现已发布,所以这就是你   可以期待它。

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

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

很难说这实际上在clang中使用了多少程度。似乎<atomic>基本上适用于某些类型。我正在为其他类型获得编译器断言,说原子类型是意外的,这对它所使用的类型有一点信心。

答案 1 :(得分:1)

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