天天看点

C++多线程编程

      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 文件

       有兴趣的读者可以看下运行效果,在添加了类内部锁之后,有效的实现了数据的同步。

       欢迎讨论。 

继续阅读