線程控制知識點
我們知道創(chuàng)建新進程的時候會把父進程的資源復制一份到子進程里面洪燥,如果創(chuàng)建的進程過多,就會占用大量的系統(tǒng)資源乳乌,由此捧韵,誕生出了線程,線程是為了將進程的某些屬性展開汉操,作為獨立的調(diào)用單位再来,不同時作為占有資源的基本單位。
線程是進程內(nèi)的一個獨立的可執(zhí)行單元客情,一個進程至少有一個線程,也可以有多個線程癞己,線程并不擁有資源膀斋,而是共享和使用包含它的進程所擁有的所有資源。
下面我們來了解一下線程相關的函數(shù):
1痹雅、線程創(chuàng)建函數(shù):
int pthread_create(pthread_t* thread, const pthread_attr_t *attr仰担,void*(*start_rtn) (void*),void * arg);
參數(shù)說明:
thread: 待創(chuàng)建線程的id地址(指針)類型為pthread_t(長整型)
attr: 創(chuàng)建線程時的線程屬性(暫時可忽略绩社,NULL)
void* (*start_rtin)(void*): 返回值是void*類型的指針函數(shù)摔蓝,即線程體,其參數(shù)類型為void*,即函數(shù)形式為:void * fun (void *)
arg: 傳遞給線程函數(shù)的參數(shù)
返回值:成功返回0愉耙,失敗返回錯誤編號
線程創(chuàng)建函數(shù)包含在頭文件#include <pthread.h>里面贮尉。
我們可以通過在線程里面調(diào)用 pthread_t pthread_self(void) 函數(shù)來獲得當前線程的進程號。
下面是一個非常重要的線程控制函數(shù)朴沿,線程等待函數(shù):
int pthread_join(pthread_t thread, void **retval)
pthread_join()將調(diào)用它的線程阻塞猜谚,一直等到被等待的線程結(jié)束為止,當函數(shù)返回時赌渣,被等待線程的資源被收回魏铅。第一個參數(shù)是被等待的線程標志符,第二個參數(shù)是用戶定義的指針坚芜,存放被等待線程的返回值览芳。
線程退出函數(shù):
void pthread_exit(void *retval);
int pthread_cancel(pthread_t thread);
pthread_exit()終止調(diào)用線程,retval為線程的返回值鸿竖;
pthread_cancel終止由參數(shù)thread 指定的線程沧竟。
下面是一個簡單的線程編程實例:
#include <stdio.h>
#include <pthread.h>
void *thread(void)
{
printf("This is a pthread.\n");
}
int main(void)
{
pthread_t id;
int i, ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if (ret!=0)
{
printf ("Create pthread error!\n");
exit (1);
}
for (i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return(0);
}
下面我們了解一下線程參數(shù)傳遞的用法铸敏,例子:
#include <pthread.h>
#include <stdio.h>
void *create(void *arg){
//puts要求參數(shù)是char*類型,強制類型轉(zhuǎn)換:
puts((char*)arg);
}
int main(int argc, char *argv[])
{
pthread_t tidp;
int error;
char* str="string from main";
error = pthread_create(&tidp, NULL, create,(void*)str);
pthread_join(tidp, NULL);
return 0;
}
我們將str作為參數(shù)傳遞到create線程里在里面進行強制類型轉(zhuǎn)換屯仗,然后輸出搞坝,這就是最簡單的線程參數(shù)傳遞的例子。