C++的多线程不同于C语言的多线程,对于我这个从C转向C++的来说更是觉得很难理解;来新公司的这段时间也是一直在思考这方面的事情,近期一直在检查程序中死锁的问题;就总结以下最近对于C++多线程编程的心得吧。
C++的多线程主要体现在两方面,一方面是对于全局数据的线程同步。我们看下面的实例
首先我们封装一个Thread类
Thread.h 文件
Thread.cpp 文件
然后我们新建MyThread类,继承自Thread类,以实现不同的算法。
MyThread.h
MyThread.cpp
main.cpp
Makefile文件,写的不好,大家见谅啊
make并且运行之后,看下运行情况 为了节省空间我只给出了几个数据,有兴趣大家可以展示以下
线程1和2交替在终端打印,但是如果我们添加互斥量(相当于是对终端访问的互斥量)之后会出现什么情况呢?
我们修改MyThread.cpp文件如下
我们可以运行一下看下打印信息,没有数据的冲突,因为数据量太大,在此不列出。
C++封装的概念使不同对象之间的私有数据不会交错,这个概念是我这个从C转向C++一直无法理解,尤其是在遇见多线程的情况下,但是这并不表明私有数据不需要加锁,因为可能涉及到类中不同的方法在同时访问或者修改数据。看下面的例子
我们将main.cpp文件修改如下,
将MyThread.cpp文件中的run函数也略作修改
大家可以看下运行结果,在这里就不作详细说明;
为了解决上述的冲突,我们需要在类中添加锁,为了我们修改MyThread.h MyThread.cpp 和 main.cpp函数
MyThread.h文件
MyThread.cpp文件
main.cpp 文件
有兴趣的读者可以看下运行效果,在添加了类内部锁之后,有效的实现了数据的同步。
欢迎讨论。