目前为止(2014-11-30),GCC其实已经基本上完全支持C++11的所有功能了,事实上从GCC4.7之后,就支持了-std=c++11选项,在4.7版本之前,也开始支持-std=c++0x的选项了

但是目前由于MinGW工作组的问题(没有跟上GNU GCC工作组的步伐,事实上目前GCC已经更新到4.9了,MinGW-Installer中能获取的最新版本的G++还停留在4.8.1版本,不仅如此,尽管是4.8.1,MinGW并没有提供很多C++11应有的功能)。(也就是说,你在非Windows系统上使用GCC已经可以完全支持C++11的全部功能了,但是在Windows上,至少目前还不能)。

比如说<regex>和<thread>,MinGW都没有提供实现

下面是从http://www.cplusplus.com/reference/thread/thread/拷贝过来的一个例程,在MinGW-GCC-4.8.1的编译的时候会提示如下的错误

main.cpp|17|error: 'thread' is not a member of 'std'|

  1. // thread example
  2. #include <iostream> // std::cout
  3. #include <thread> // std::thread
  4.  
  5. void foo()
  6. {
  7. // do stuff...
  8. }
  9.  
  10. void bar(int x)
  11. {
  12. // do stuff...
  13. }
  14.  
  15. int main()
  16. {
  17. thread first (foo); // spawn new thread that calls foo()
  18. thread second (bar,); // spawn new thread that calls bar(0)
  19.  
  20. std::cout << "main, foo and bar now execute concurrently...\n";
  21.  
  22. // synchronize threads:
  23. first.join(); // pauses until first finishes
  24. second.join(); // pauses until second finishes
  25.  
  26. std::cout << "foo and bar completed.\n";
  27.  
  28. return ;
  29. }

你在使用<regex>的时候也会出现这样那样的compiler或者linker的报错。其实就是因为MinGW并没有完全提供对这些功能的实现(我觉得与其这样,还不如直接就不提供诸如<thread>或者<regex>的头,你这不是误导用户么)。

坐等MinGW的更新啊。

下面说一下Windows下,ZThread库的使用(教程参考其文档,或者Thinking in C++ vol2)

参考资料:http://www.cnblogs.com/moodlxs/archive/2012/10/16/2725329.html

下载地址:http://zthread.sourceforge.net (我下载的是2.3.2),下面我用ZTHREAD_HOME代表下载后的Zthread文件夹,例如F:/ZThread-2.3.2,里面包含doc,include,src等等几个子文件夹

在编译之前:

阅读README,引用如下:

COMPILING:

ZT_POSIX, ZT_WIN32 should be defined to specific what platofrm your building
on this. This is mainly so the right modifiers can be placed on class and
function definitions to export things from a DLL properly if your using the
WIN32 implementation. If you leave these flags out ZThreads will try to guess.

See BUILDING for more details.

查看BUILDING,我引用如下:

HOWTO COMPILE THE SOURCE:

There are several options for compiling the source code.

* The preferred option is to use the configure script that is provided.
I can only actively maintain one method for compiling and configuring
the source.

./configure --help will provide a list of options detailing this method.

* Any other method is up to you. There are simply too many compilers,
too many versions and too many platforms to maintain separate build files
for.

BUT, this doesn't mean you are out of luck.

I have structured the code so that it is very simple to compile the library
however suits your needs best. All you need to do is include the .cxx files
in the src/ directory (not the subdirectories) in your build rule, and add the
include directory to your compilers include/ path.

Anything else you need to do is specific to your compiler and I leave the
details up to you.

Anything you want to tweak configuration-wise can be done by editing
include/zthread/Config.h

编译:我选择编译为SLL(Static Link Library),也就是.a或者.lib文件,步骤如下

  • 为了让g++编译器能找到所需的头文件,先把ZTHREAD_HOME/include下的所有东西(其实就是一个zthread文件夹和CVS文件夹)拷贝到MinGW_HOME/include中
  • 打开terminal,切换到ZTHREAD_HOME/src,使用命令:g++ -c *.cxx编译所有的cxx文件(但不链接)得到一系列.o文件(其中有很多Warning,考虑到ZThread毕竟是2005年就停止更新的库了,所以warning就直接无视,但是有几个error,根据error的提示,使用命令:g++ -fpermissive -c *.cxx编译通过)
  • 然后使用命令:ar -r zthread_win32.a *.o打包成库文件,然后把zthread_win32.a放到ZTHREAD_HOME/bin目录下(没有的话就创建一个bin文件夹)

配置:(注意,Debug和Release都要设置)

  • 打开CodeBlocks的一个项目,例如我的test,选择Project>Build Options>Linker Settings
  • 点击Add,添加ZTHREAD_HOME/bin/zthread_win32.a
  • 然后选择Search directories>Compiler
  • 点击Add,添加ZTHREAD_HOME/include

例程:

main.cpp

  1. #include "LiftOff.h"
  2.  
  3. #include <zthread/Thread.h>
  4.  
  5. #include <iostream> // std::cout
  6.  
  7. using namespace ZThread;
  8.  
  9. int main()
  10. {
  11. try {
  12. Thread th(new LiftOff(, ));
  13. std::cout << "waiting for lift off" << std::endl;
  14. } catch (Synchronization_Exception &e) {
  15. std::cerr << e.what() << std::endl;
  16. }
  17. }

LiftOff.h

  1. #ifndef LIFTOFF_H
  2. #define LIFTOFF_H
  3.  
  4. #include <zthread/Runnable.h>
  5.  
  6. class LiftOff : public ZThread::Runnable
  7. {
  8. public:
  9. LiftOff(int countDown_, int id_);
  10. ~LiftOff();
  11. void run();
  12. private:
  13. int countDown;
  14. int id;
  15. };
  16.  
  17. #endif // LIFTOFF_H

LiftOff.cpp

  1. #include "LiftOff.h"
  2.  
  3. #include <zthread/Runnable.h>
  4.  
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. LiftOff::LiftOff(int countDown_, int id_)
  10. :countDown(countDown_), id(id_)
  11. {
  12. // do nothing
  13. }
  14.  
  15. LiftOff::~LiftOff()
  16. {
  17. cout << "LiftOff" << id << " destroyed" << endl;
  18. }
  19.  
  20. void LiftOff::run()
  21. {
  22. while (countDown--)
  23. cout << id << " count: " << countDown << endl;
  24. cout << id << "LiftOff!" << endl;
  25. }

c++11 thread (目前我使用的ZThread库)的更多相关文章

  1. 漫谈C++11 Thread库之原子操作

    我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...

  2. c++11 thread的学习

    http://www.cnblogs.com/wxquare/p/6736202.html 还没开始 留个链接 使用c++11 thread支持实现  一个生产者消费者模型 下面是一个生产者消费者问题 ...

  3. c++ 11 thread 初试

    最新的 c++11标准整合进了 线程支持.以下写一个小程序測试一下. 測试代码: #include <iostream> #include <thread> void hell ...

  4. 在Windows下使用nmake+Makefile+编译ZThread库(附例子)

    ----------2015/01/09/23:21更新----------------------------------- 关于保留DEBUG信息的一个简单例子,见这篇随笔 ----------2 ...

  5. 在Window和Linux下使用Zthread库

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  6. (原创)发布一个c++11开发的轻量级的并行Task库TaskCpp

    TaskCpp简介 TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍.既然已经有了这 ...

  7. 在Window和Linux下使用Zthread库(跨平台高级面向对象的线性和sycnchronization 库)

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  8. 漫谈c++11 Thread库之使写多线程程序

    c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学 ...

  9. 并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程

    c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, ...

随机推荐

  1. python的globals()使用

    使用命令pyrasite-shell pid,可以与进程进行shell交互,获取,在shell里执行globals(),可以获取整个进程的全部全局变量,比如django应用.flask应用的变量,而不 ...

  2. [转]在SSIS中,使用“包配置”时的常见错误与解析

    本文转自:http://www.cnblogs.com/invinboy/archive/2008/05/26/1034312.html 在以前的DTS中,在包的开发.测试.发布迁移过程中你必须手动的 ...

  3. iOS:自动读取图片插件KSImageNamed-Xcode-master的使用

    gitHub链接:https://github.com/ksuther/KSImageNamed-Xcode   KSImageNamed-Xcode是一个Xcode插件,可以帮助开发者在Xcode中 ...

  4. CMakeFile命令之file

    file:文件操作命令. file(WRITE filename "message towrite"... ) WRITE 将一则信息写入文件’filename’中,如果该文件存在 ...

  5. 高性能WEB开发:Javascript自身执行效率

    Javascript中的作用域链.闭包.原型继承.eval等特性,在提供各种神奇功能的同时也带来了各种效率问题,用之不慎就会导致执行效率低下. 1.全局导入 我们在编码过程中多多少少会使用到一些全局变 ...

  6. PLSQL Developer连接远程Oracle方法(非安装client)

    远程连接Oracle比較麻烦,通常须要安装oracle的客户端才干实现. 通过instantclient能够比較简单的连接远程的Oracle. 1.新建文件夹D:\Oracle_Cleint用于存放相 ...

  7. Spring框架学习(4)spring整合hibernate

    内容源自:spring整合hibernate    spring整合注解形式的hibernate 这里和上一部分学习一样用了模板模式, 将hibernate开发流程封装在ORM层提供的模板类Hiber ...

  8. android带有文字的图片按钮的两种实现方式

    android带有文字的图片按钮的两种实现方式 1). TextView对Button用相对布局,这要要求按钮的背景图片要留下空白位置给文字.这种方式开发比较简单,适合做一些风格一致的Button. ...

  9. C#中使用正则

      using System.Text.RegularExpressions;           private void button1_Click(object sender, EventArg ...

  10. Linux内核分析:实验八--Linux进程调度与切换

    刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这篇文章主要分析Li ...