Linux 多線程編程,linux多線程編程
這篇文章總結下 Linux 中多線程編程中能用到的幾個函數,當然,需要同步操作的時候還需要加鎖的操作,這裡,沒有列舉的這麼具體,只是把最常用的函數介紹下。
在編寫多線程程式在編譯的時候需要加上 -lpthread,因為用到了 pthread 庫。
/**標頭檔:#include <pthread.h>功能:建立一個線程參數:tid : 用於返回線程 idattr : 設定線程的屬性,如線程優先順序,初始棧大小等,一般使用預設值,即 NULLfunc :線程執行函數,從定義中可以看出,它返回 void* 類型,參數也是 void* 類型arg :傳遞給線程的參數,如果參數不止一個,需要用結構體傳遞傳回值:執行成功返回 0, 執行失敗返回一個非 0 值*/int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);/**標頭檔:#include <pthread.h>功能:等待一個線程,類似於 wait4() 函數,即用於釋放線程所佔的資源參數:tid :指定要等待的線程 idstatus :用於帶回線程的傳回值傳回值:執行成功返回 0, 執行失敗返回一個錯誤編碼*/int pthread_join (pthread_t tid, void ** status);/**標頭檔:#include <pthread.h>功能:用於返回當前線程的 id傳回值:線程 id註: typedef unsigned long int pthread_t;*/pthread_t pthread_self (void);/**標頭檔:#include <pthread.h>功能:分離線程,類似於把一個進程變成後台進程,即脫離當前的控制終端,那麼,我們就不需要調用 pthread_join 函數去等待這個線程的執行結束參數:tid :需要分離的線程 id傳回值:執行成功返回 0, 執行失敗返回一個錯誤編碼*/int pthread_detach (pthread_t tid);/**標頭檔:#include <pthread.h>功能:一般線上程執行函數的最後添加這麼一條語句,也可以不寫,代表寫線程生命週期的結束,注意,線程執行函數的最後不能寫 exit 函數,因為,這樣會使整個進程結束,當進程結束時,由於會回收整個地址空間,而線程是共用進程地址空間的,所以,進程內所有的線程都會終止,會成為程式的一個 BUG參數:用於帶回線程結束的傳回值*/void pthread_exit (void *status);
最後,給出一個利用這些函數的例子:
#include <stdio.h>#include <pthread.h>#include <unistd.h>#define THREAD_COUNT2void dlut_print_thread_id();void * dlut_thread_func(void *arg);int main(int argc, char **argv, char **environ){int i = 0;pthread_t tid[THREAD_COUNT];void *status;for (i = 0; i != THREAD_COUNT; i++){pthread_create((pthread_t *)&tid[i], NULL, dlut_thread_func, (void *)"BruceZhang");}for (i = 0; i != THREAD_COUNT; i++){pthread_detach(tid[i]);}sleep(1);return 0;}void dlut_print_thread_id(char *s){pthread_t tid;tid = pthread_self();printf("%s : this new thread's id is %d\n", s, (int)tid);return;}void * dlut_thread_func(void *arg){dlut_print_thread_id((char *)arg);return (void *)0;}