学了这么久我才刚刚知道C++11居然对多线程有如此丰富的支持,一方面感慨自己学的还是太少了,一方面真的很开心可以告别自己封装mutex,线程,currentthread这些东西了。最重要的一点,在windows上写的代码和在linux上也可以编译运行,这意味着可以使用宇宙第一IDE来调试多线程程序。我会用这个系列记录自己学习C++11多线程的过程。
C++11中引入了thread这个头文件,终于把线程当成对象来操作了,以前还要自己封装,还要自己定义每个线程的私有空间,现在C++11把一切都帮我们做了。
除了thread还有atomic,可以让我们让我们非常轻松的申请一个原子数,其中还包含一个atomic_flag,我们可以用它来制作一个自旋锁。
首先来看看atomic_flag,它内含一个标志位,它支持两个操作test_and_set()和clear(),在使用之前用宏ATOMIC_FLAG_INIT初始化,初始化意义是吧其中的标志位置位0,test_and_set检测其中的标志位,如果是0就置位1,返回0,如果是1就不变,返回1,这些操作都是原子性的,clear用于把标志位置位0。
下面的程序可以用来熟悉上述的几个操作。大致的意思是创建10个线程,在确保所有线程都创建好了之后,开始计数,第一个计数完毕的输出自己的id。其中的全局原子数ready起到了类似发令枪的作用,yield用于防止忙等待,如果此时ready还没有准备好,就把时间片交出去。
#include<iostream>
#include<atom