Linux下的多線程程式設計需要注意的是程式需要包含頭檔案pthread.h,在生成可執行檔案的時候需要連結庫libpthread.a或者libpthread.so。
pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *),void *arg);
參數說明:
Thread 标示一個線程,它是一個pthread_t類型的變量(unsigned long int)
attr 用于設定線程的屬性,預設是null
start_routine當線程配置設定資源成功後,線程中所運作的單元,通俗的說就是你自己寫的一個函數
Arg線程函數運作時傳入的一個參數,一般可以用這個傳入的參數去控制線程結束
函數傳回值:
建立成功傳回0,建立失敗傳回非0值,常見錯誤傳回代碼為EAGAIN何EINVAL,EGAIN标示系統中線程的數量達到上限,錯誤代碼EINVAL表示線程的屬性非法。
注意:線程建立城成功後,新建立的線程按照參數3和參數4确定一個運作函數,原來的線程線上程建立函數傳回後繼續運作下一行代碼。
線程結束函數:pthread_join()和pthread_exit()
pthread_join()用來等待一個線程運作結束。這個函數是阻塞函數,一直被等待的線程結束為止,函數才傳回并且收回被等待線程的資源。函數的原型為:
Extern int pthread_join_P((pthread_t _th,void **__thread_return));
_th:線程的标示符,也就是線程建立成功的值,在通俗的說就是pthread_create函數運作成功後的第一個參數
__thread_return:傳回值,它是一個指針用來存貯被等待線程的傳回值。
線程函數的結束方式有兩種:一種是線程函數運作結束,不用傳回結果;另一種就是通過函數pthread_exit()來實作,将結果傳出。
函數原型是:
Extern void pthread_exit_P((void*_retval))
參數是函數的傳回值,這個值可以被pthread_join函數捕獲,通過__thread_return參數獲得此值。
說道線程的建立還有一點必須要提及,那就是線程的屬性。一般在我們建立線程的時候設定attr屬性的時候都是使用null,這個是預設參數。但是在很多時候需要調整線程的屬性,特别是線程優先級。
線程的屬性結構為:pthread_attr_t,在頭檔案<pthreadtype.h>中定義
typedef struct
{
int detachstate; 線程的終止狀态
int schedpolicy; 線程排程政策(優先級)
struct sched_param schedparam; 線程的排程參數
int inheritsched; 線程的繼承性
int scope; 線程的作用域
size_t guardsize; 線程棧末尾的警戒緩沖區大小
int stackaddr_set; 運作棧
void * stackaddr; 線程棧的位置
size_t stacksize; 線程棧的大小
}pthread_attr_t;
要注意的是線程的屬性值不能直接設定,必須要用先關的函數進行操作。線程屬性的初始化函數pthread_attr_init(),這個函數必須在pthread_create()函數之前調用。
線程的互斥函數有:互斥函數的初始化pthread_mutex_init(),互斥函數的鎖定函數pthread_mutex_lock(),互斥函數的預鎖定函數pthread_mutex_trylock(),互斥函數的解鎖函數pthread_mutex_unlock(),互斥函數的銷毀函數pthread_mutex_destroy()
廢話不多說,上代碼:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define MUXNUMBER 10
pthread_mutex_t test_mutex;
int testi = 0;
int testis[10 * 1000];
int count=0;
void testfun(void)
testis[testi] = testi * 2;
usleep(1000);
testi++;
}
void thread_func()
int m_count=0;
while(m_count<1000)
{
pthread_mutex_lock(&test_mutex);
testfun();
pthread_mutex_unlock(&test_mutex);
m_count++;
//sleep(1);
}
int main()
pthread_t t[10];
pthread_mutex_init(&test_mutex,NULL);
int i;
for(i=0;i<MUXNUMBER;i++)
{
if(pthread_create(&t[i],NULL,(void*)thread_func,NULL) == -1)
{
printf("create Thread error !\n");
exit(1);
}
//sleep(1);
}
pthread_join(t[i],NULL);
pthread_mutex_destroy(&test_mutex);
for(i=0;i<10000;i++)
if(testis[i]!=i*2)
printf("第%d個資料出錯!:%d\n",i,testis[i]);
return 0;
本文轉自xsster51CTO部落格,原文連結:http://blog.51cto.com/12945177/1930296 ,如需轉載請自行聯系原作者