1、UNIX多線程
1.1 概述
UNIX多線程是采用面向過程的設計,所有的使用單位都是函數,同時UNIX線程是一個進程內部的一個控制序列,同一個進程內的所有線程都共處同一個地址空間。
1.2 創建
對於UNIX多線程的使用方式,也非常簡單。只需在通過pthread_create函數創建線程時,設置相應的啟動函數並傳遞給啟動函數相應參數,當創建完成后線程立即啟動。而其它的多線程特性可以參考其它資料。
如下是UNIX多線程的創建實例:
-
void *pthread_main(void*)
-
{
-
printf("hello,world\n");
-
return NULL;
-
}
-
-
void thread()
-
{
-
pthread_t pID;
-
pthread_create(&pID, NULL, pthread_main, NULL);
-
}
-
輸出:
-
hello,world
2、C++多線程
2.1 概述
在C++ 98標准中沒有語言級別的並發支持,因為在C++誕生很久之后才出現多線程等並發概念。由於UNIX多線程設計是面向過程的概念,而C++主要特性是面向對象,當然C++也可以采用面向過程的思想使用UNIX多線程,但這不符合C++的設計思想。
所以本文介紹如何以C++的面向對象思想使用UNIX的多線程設計,從而提高軟件設計的效率。
2.2 創建
在同一個進程中的多線程是處於同一個地址空間內,即只要知道一個線程的地址,就能夠在另一個線程中訪問該地址的內容,本文即介紹同一個進程中的多線程使用方式。
C++創建多線程與UNIX創建方式類似,只是指定線程的啟動函數和傳遞參數不同。可以給pthread_create函數傳遞C++類的靜態成員函數和該類的對象指針,因為在不同線程之間的地址是處於同一個地址空間內,所以其他線程也可以訪問到。
從而通過這種方式,在C++類的靜態方法中操作本身類的成員或成員函數,即使本身的成員是私有類型,在靜態方法中依然能夠使用。
如下是使用C++創建多線程的簡單實例:
-
class Thread
-
{
-
public:
-
static void* mainMethod(void *bt)
-
{
-
Thread *bt = (Thread*)vbt;
-
printf("age:%d\n",bt->age);
-
-
bt->height = 34;
-
printf("height:%d\n",bt->height);
-
return vbt;
-
}
-
public:
-
int age;
-
private:
-
int height;
-
};
-
-
void thread() //其他函數或類成員方法中創建新的線程
-
{
-
Thread *bt = new Thread();
-
bt->age = 23;
-
-
pthread_t pt;
-
pthread_create(&pt, NULL, Thread::mainMethod, (void*)bt);
-
}
-
輸出:
-
age:23
-
height:34
3、boost多線程
3.1 概述
在boost的多線程使用方式與UNIX的使用方式類似,但boost創建方式只需指定線程啟動函數和傳遞的函數實參,而無需再配置其它參數。一樣在創建線程后,立即執行啟動函數,不需要調用類似start()、begin()類似的函數。
3.2 創建
boost的多線程創建方式也是基於面向過程的設計,若按面向對象的思想使用時,可以按C++的使用方式進行創建,即創建線程時傳遞C++的靜態成員函數和該類對象的指針。不同的是在傳遞和接收時,不需進行類型轉換。
-
class boostThread
-
{
-
public:
-
static void* mainMethod(boostThread *bt) //不需類型轉換
-
{
-
printf("age:%d\n",bt->age);
-
bt->height = 34;
-
printf("height:%d\n",bt->height);
-
return bt;
-
}
-
public:
-
int age;
-
private:
-
int height;
-
};
-
void thread() //其他函數或類成員方法中創建新的線程
-
{
-
Thread *bt = new Thread();
-
bt->age = 23;
-
thread td(boostThread::mainMethod, bt); //不需類型轉換
-
}
-
輸出:
-
age:23
-
height:34