linux下C語言多執行緒程式設計例項

2021-05-25 02:10:15 字數 4451 閱讀 6515

學東西,往往例項才是最讓人感興趣的,老是學基礎理論,不動手,感覺沒有成就感,呵呵。

下面先來乙個例項。我們通過建立兩個執行緒來實現對乙個數的遞加。

或許這個例項沒有實際運用的價值,但是稍微改動一下,我們就可以用到其他地方去拉。

下面是我們的**:

/*thread_example.c :  c multiple thread programming in linux

*author : falcon

*e-mail :

[email protected]

*/#include #include #include #include #define max 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void *thread1()

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

pthread_exit(null);

}void *thread2()

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

pthread_exit(null);

}void thread_create(void)

void thread_wait(void)

if(thread[1] !=0)

}int main()

下面我們先來編譯、執行一下

引文:

falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c

falcon@falcon:~/program/c/code/ftp$ ./thread_example

我是主函式哦,我正在建立執行緒,呵呵

執行緒1被建立

執行緒2被建立

我是主函式哦,我正在等待執行緒完成任務阿,呵呵

thread1 : i'm thread 1

thread1 : number = 0

thread2 : i'm thread 2

thread2 : number = 1

thread1 : number = 2

thread2 : number = 3

thread1 : number = 4

thread2 : number = 5

thread1 : number = 6

thread1 : number = 7

thread2 : number = 8

thread1 : number = 9

thread2 : number = 10

thread1 :主函式在等我完成任務嗎?

執行緒1已經結束

thread2 :主函式在等我完成任務嗎?

執行緒2已經結束

例項**裡頭的注釋應該比較清楚了吧,下面我把網路上介紹上面涉及到的幾個函式和變數給引用過來。

引文:

執行緒相關操作

一 pthread_t

pthread_t在標頭檔案/usr/include/bits/pthreadtypes.h中定義:

typedef unsigned long int pthread_t;

它是乙個執行緒的識別符號。

二 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_create,pthread_join和pthread_exit。下面,我們來了解執行緒的一些常用屬性以及如何設定這些屬性。

互斥鎖相關

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

一 pthread_mutex_init

函式pthread_mutex_init用來生成乙個互斥鎖。null引數表明使用預設屬性。如果需要宣告特定屬性的互斥鎖,須呼叫函式 pthread_mutexattr_init。函式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_delay_np

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

注意:1 需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓執行緒睡眠一段時間,讓執行緒釋放互斥鎖,等待另乙個執行緒使用此鎖。下面的參考資料1裡頭說明了該問題。但是在linux下好像沒有pthread_delay_np那個函式(我試了一下,提示沒有定義該函式的引用),所以我用了sleep來代替,不過參考資料2中給出另一種方法,好像是通過pthread_cond_timedwait來代替,裡頭給出了一種實現的辦法。

2 請千萬要注意裡頭的注釋comment1-5,那是我花了幾個小時才找出的問題所在。

如果沒有comment1和comment4,comment5,將導致在pthread_join的時候出現段錯誤,另外,上面的comment2和comment3是根源所在,所以千萬要記得寫全**。因為上面的執行緒可能沒有建立成功,導致下面不可能等到那個執行緒結束,而在用pthread_join的時候出現段錯誤(訪問了未知的記憶體區)。另外,在使用memset的時候,需要包含string.h標頭檔案哦

參考資料:

1。linux下的多執行緒程式設計

[url]

2。pthread_delay_np(這裡頭有個關於posix條件變數的例子)

[url]

3。pthread_join和段錯誤(非常感謝這裡頭的哥們,千萬要看哦)

[url]

4。posix執行緒程式設計指南[學習linux下多執行緒,不看這個你會後悔的]

[url]

linux下C語言多執行緒程式設計

include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...

多執行緒程式設計 c語言linux下

適用與linux系統 1.了解基本概念 程序 是計算機所執行的乙個任務的描述,是面向作業系統的最小單位,作業系統能執行很多程序 執行自己寫的乙份 程式,就是讓作業系統執行乙個自己程式的程序 作業系統會根據程式分配定量的資源 執行緒 面想程式 程序 的,把乙個程式分成多個執行緒可以實現並髮式,多工執行...

linux 下c語言 多執行緒程式設計

最近學習c語言和linux,記錄一下linux中線程的簡單使用 linux執行緒一般用pthread庫建立。pthread是 posix thread的簡稱。在linux的 lib目錄下,可以找到名為libpthread x.x.so x.x是版本號 的庫。下面模擬兩個執行緒 threaddemo....