天天看點

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 檔案

       有興趣的讀者可以看下運作效果,在添加了類内部鎖之後,有效的實作了資料的同步。

       歡迎讨論。 

繼續閱讀