C++多線程編程


1UNIX多線程

1.1 概述

      UNIX多線程是采用面向過程的設計,所有的使用單位都是函數,同時UNIX線程是一個進程內部的一個控制序列,同一個進程內的所有線程都共處同一個地址空間。

1.2 創建

      對於UNIX多線程的使用方式,也非常簡單。只需在通過pthread_create函數創建線程時,設置相應的啟動函數並傳遞給啟動函數相應參數,當創建完成后線程立即啟動。而其它的多線程特性可以參考其它資料。

如下是UNIX多線程的創建實例:

  1. void *pthread_main(void*)
  2. {
  3.      printf("hello,world\n");
  4.      return NULL;
  5. }
  6.  
  7. void thread()
  8. {
  9.      pthread_t pID;
  10.      pthread_create(&pID, NULL, pthread_main, NULL);
  11. }
  12. 輸出:
  13.      hello,world

2C++多線程

2.1 概述

      在C++ 98標准中沒有語言級別的並發支持,因為在C++誕生很久之后才出現多線程等並發概念。由於UNIX多線程設計是面向過程的概念,而C++主要特性是面向對象,當然C++也可以采用面向過程的思想使用UNIX多線程,但這不符合C++的設計思想。

所以本文介紹如何以C++的面向對象思想使用UNIX的多線程設計,從而提高軟件設計的效率。

2.2 創建

      在同一個進程中的多線程是處於同一個地址空間內,即只要知道一個線程的地址,就能夠在另一個線程中訪問該地址的內容,本文即介紹同一個進程中的多線程使用方式。

      C++創建多線程與UNIX創建方式類似,只是指定線程的啟動函數和傳遞參數不同。可以給pthread_create函數傳遞C++類的靜態成員函數和該類的對象指針,因為在不同線程之間的地址是處於同一個地址空間內,所以其他線程也可以訪問到。

    從而通過這種方式,在C++類的靜態方法中操作本身類的成員或成員函數,即使本身的成員是私有類型,在靜態方法中依然能夠使用。

如下是使用C++創建多線程的簡單實例:

  1. class Thread
  2. {
  3. public:
  4.     static void* mainMethod(void *bt)
  5. {
  6.       Thread *bt = (Thread*)vbt;
  7.       printf("age:%d\n",bt->age);
  8.  
  9.      bt->height = 34;
  10.      printf("height:%d\n",bt->height);
  11.      return vbt;
  12. }
  13. public:
  14.     int age;
  15. private:
  16.     int height;
  17. };
  18.  
  19. void thread() //其他函數或類成員方法中創建新的線程
  20. {
  21.       Thread *bt = new Thread();
  22.       bt->age = 23;
  23.  
  24.     pthread_t pt;
  25.     pthread_create(&pt, NULL, Thread::mainMethod, (void*)bt);
  26. }
  27. 輸出:
  28.      age:23
  29.      height:34

3boost多線程

3.1 概述

      在boost的多線程使用方式與UNIX的使用方式類似,但boost創建方式只需指定線程啟動函數和傳遞的函數實參,而無需再配置其它參數。一樣在創建線程后,立即執行啟動函數,不需要調用類似start()、begin()類似的函數。

3.2 創建

      boost的多線程創建方式也是基於面向過程的設計,若按面向對象的思想使用時,可以按C++的使用方式進行創建,即創建線程時傳遞C++的靜態成員函數和該類對象的指針。不同的是在傳遞和接收時,不需進行類型轉換。

  1. class boostThread
  2. {
  3. public:
  4.     static void* mainMethod(boostThread *bt) //不需類型轉換
  5. {
  6.         printf("age:%d\n",bt->age);
  7.         bt->height = 34;
  8.         printf("height:%d\n",bt->height);
  9.         return bt;
  10. }
  11. public:
  12.     int age;
  13. private:
  14.     int height;
  15. };
  16. void thread() //其他函數或類成員方法中創建新的線程
  17. {
  18.      Thread *bt = new Thread();
  19.      bt->age = 23;
  20.      thread td(boostThread::mainMethod, bt); //不需類型轉換
  21. }
  22. 輸出:
  23.       age:23
  24.       height:34

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM