本人刚刚开始看《C++ Concurrency in Action》这本书的英文原版。很多多线程知识还处于比较模糊的状态,因此决定在看书的同时写点测试小程序,在这里做一下记录,发出来与大家一起讨论。有些地方会引用作者的原话,并且本着谨慎的态度发表自己的看法。如有问题还望不吝赐教,欢迎大家来讨论。本文本着实用的目的,所以别指望它多么正规,多么好看,实用才是硬道理。QQ:114211200
有人也许会说,既然你还是个初学者,为什么要发出来误导人家?首先,我在这里声明一下,我发这些的目的在于3点:记录、讨论、分享。记录下学习的过程和中间的测试代码以及当时的看法,如果有自己没有注意到或者没有分析透彻的地方希望能与别人讨论,最后也希望能给一些同样是初学者的同学提供一点点帮助。话说真正的高手是没有时间来发表这些的,时间都是宝贵的,你懂的。
本来使用vs2013做测试和练习,结果发现vs2013对c++11多线程支持的不够好,比如下面的代码:
void f(unique_ptr<int> u)
{
cout << *u << endl;
}
{
cout << *u << endl;
}
int main()
{
unique_ptr<int> p(new int(123));
thread t(f, std::move(p));//无法在vs2013上编译通过,vs2015可以编译通过
t.join();
{
unique_ptr<int> p(new int(123));
thread t(f, std::move(p));//无法在vs2013上编译通过,vs2015可以编译通过
t.join();
system("pause");
return 0;
}
return 0;
}
其中给新创建的子线程传递参数这句就无法在vs2013上编译通过,但是在vs2015上可以编译通过,因此暂时改为使用vs2015做测试。
本系列文章中的源码都是如未做特殊说明都会至少包含以下头文件:
#include <thread>
#include <iostream>
#include <string>
#include <thread>
#include <iostream>
#include <string>
另外,为了让代码简单,都会在.h文件或.cpp文件中做出如下声明:
using namespace std;
using namespace std;
这是出于测试的目的,在现实中编写代码不要在头文件中声明“using namespace std;”
顺便发表一点个人感慨:我从事c++这几年发现一个严重的问题,我始终认为2、3个人在一起学习的效率是非常高的,也一直想找一些水平相近而且志同道合的人一起学习、一起进步,但是一直没有找到。没办法只能自己学了,遇到问题查资料,去QQ群讨教,结果收效甚微,往往都是最终靠自己把问题研究明白。不知道大家是否也有这样的感觉呢?