linux下的多執行緒學習

2021-07-07 04:49:57 字數 3000 閱讀 3980

下面先來乙個例項來感受下linux下c語言多執行緒程式設計的樂趣!我們通過建立兩個執行緒來實現對乙個數的遞加。先不去理會**的含義,我們先執行linux,在其中編寫我們的第乙個c語言多執行緒程式。

#include #include #include #include #include #define max 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0,i;

void *thread1(void *)

printf("thread1 :主函式在等我完成任務嗎?\n");

pthread_exit(null);

}void *thread2(void *)

printf("thread2 :主函式在等我完成任務嗎?\n");

pthread_exit(null);

}void thread_create(void)

void thread_wait(void)

if(thread[1] !=0)

}int main()

執行結果如下:

下面我簡單地介紹下上面涉及到的幾個函式和變數,一方以後忘記。呵呵

一 、pthread_t型別

pthread_t 它是乙個執行緒的識別符號,建立執行緒之後,需通過該型別的變數進行標識,實際是乙個int型值。

二 、pthread_create函式

函式pthread_create用來建立乙個執行緒,它的原型為:

extern int pthread_create __p ((pthread_t *__thread, __const pthread_attr_t *__attr,void *(*__start_routine) (void *), void *__arg));

第乙個引數為指向執行緒識別符號的指標,第二個引數用來設定執行緒屬性,第三個引數是執行緒執行函式的起始位址,最後乙個引數是執行函式的引數。

這裡,我們的函式thread不需要引數,所以最後乙個引數設為空指標。第二個引數我們也設為空指標,這樣將生成預設屬性的執行緒。對執行緒屬性的設定和修改我們將在下一節闡述。當建立執行緒成功時,函式返回0,若不為0則說明建立執行緒失敗,常見的錯誤返回**為eagain和einval。前者表示系統限制建立新的執行緒,例如執行緒數目過多了;後者表示第二個引數代表的執行緒屬性值非法。

建立執行緒成功後,新建立的執行緒則執行引數三和引數四確定的函式,原來的執行緒則繼續執行下一行**。

三 pthread_join 和pthread_exit  

函式pthread_join用來等待乙個執行緒的結束。函式原型為:

extern int pthread_join __p ((pthread_t __th ,  void **__thread_return));

第乙個引數為被等待的執行緒識別符號,第二個引數為乙個使用者定義的指標,它可以用來儲存被等待執行緒的返回值。

這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被收回。

乙個執行緒的結束有兩種途徑:

一種是象我們上面的例子一樣,函式結束了,呼叫它的執行緒也就結束了;

另一種方式是通過函式pthread_exit來實現。它的函式原型為:

extern void pthread_exit __p ((void *__retval)) __attribute__ ((__noreturn__));

唯一的引數是函式的返回**,只要pthread_join中的第二個引數thread_return不是null,這個值將被傳遞給 thread_return。最後要說明的是,乙個執行緒不能被多個執行緒等待,否則第乙個接收到訊號的執行緒成功返回,其餘呼叫pthread_join的執行緒則返回錯誤**esrch。

互斥鎖相關

互斥鎖用來保證一段時間內只有乙個執行緒在執行一段**。

一 pthread_mutex_init

函式pthread_mutex_init用來生成乙個互斥鎖。函式原型為:

int  pthread_mutex_init(pthread_mutex_t  *restrict_mutex,const pthread_mutextattr_t *restrict attr);

如果需要宣告特定屬性的互斥鎖,須呼叫函式 pthread_mutexattr_init()。null引數表明使用預設屬性。函式pthread_mutexattr_setpshared和函式 pthread_mutexattr_settype用來設定互斥鎖屬性。前乙個函式設定屬性pshared,它有兩個取值, pthread_process_private和pthread_process_shared。前者用來不同程序中的執行緒同步,後者用於同步本程序的不同執行緒。在上面的例子中,我們使用的是預設屬性pthread_process_ private。第二個函式用來設定互斥鎖型別,可選的型別有pthread_mutex_normal、pthread_mutex_errorcheck、 pthread_mutex_recursive和pthread _mutex_default。它們分別定義了不同的上所、解鎖機制,一般情況下,選用最後乙個預設屬性。

二 pthread_mutex_lock 和pthread_mutex_unlock 

pthread_mutex_lock宣告開始用互斥鎖上鎖,此後的**直至呼叫pthread_mutex_unlock為止,均被上鎖,即同一時間只能被乙個執行緒呼叫執行。當乙個執行緒執行到pthread_mutex_lock處時,如果該鎖此時被另乙個執行緒使用,那此執行緒被阻塞,即程式將等待到另乙個執行緒釋放此互斥鎖。

注意:需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓執行緒睡眠一段時間,讓執行緒釋放互斥鎖,等待另乙個執行緒使用此鎖。如果不加sleep的話,執行結果很不一樣,可能是因為執行緒釋放互斥鎖比較慢??????????

另外由於g++不能預設的鏈結執行緒庫lpthread,編譯上述程式需要用這樣的格式:g++ thread.cc -lpthread

Linux下多執行緒的執行緒保護

目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...

學習linux的多執行緒

xthread.h ifndef x thread h define x thread h include extern unsigned int xsleep unsigned int imillis class xthread endif xthread.cpp include void xth...

linux 多執行緒的學習

pthread exit 的乙個目標是,把乙個指標傳遞給 pthread join函式 pthread join 函式的思路是 通過引數的返回值,將該指標值返回給 pthread join 的呼叫者 include include includeusing namespace std void th...