您好,登錄后才能下訂單哦!
線程的控制
線程的創建:
線程創建函數:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine(void*),void *arg);
返回值:成功返回0,失敗返回錯誤號。
在一個線程中調用pthread_create()創建新的線程后,當前線程從pthread_create()返回繼續往下執行,而新的線程所執行的代碼由我們傳給pthread_create()的函數指針star_routine決定。pthread_create成功返回后,新創建的線程id被填寫到thread參數所指向的內存單元。線程id的類型是thread_t,它只在當前進程中保證是唯一的,在不同的系統中thread_t這個類型有不同的實現,它可能是一個整數值,也可能是一個結構體,也可能是一個地址,用pthread_self()可獲得當前線程id。
如果任意一個線程調用了exit或_exit,則整個進程的所有線程都終止。
線程的終止:
有以下三種方法終止線程:
從線程函數return,這種方法對主線程不適用,從main函數return相當于調用exit;
一個線程可以調用pthread_cancel終止統一進程中的另一個線程;
程可以調用pthread_exit終自己;
下面我們看一段代碼,看看這3中方法的區別:
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
void *thread1(void *arg)
{
printf("thread 1 returning....\n");
return (void*)1;
}
void *thread2(void *arg)
{
printf("thread 1 exiting....\n");
pthread_exit((void*)2);
}
void *thread3(void *arg)
{
while(1)
{
printf("thread 3 is runing,wait to bu cancel...\n");
sleep(1);
}
return NULL;
}
int main()
{
pthread_t tid;
void *val;
pthread_create(&tid,NULL,thread1,NULL);
pthread_join(tid,&val);
printf("thread return,thread id is:%u,return code is:%d\n",tid,(int)val);
pthread_create(&tid,NULL,thread2,NULL);
pthread_join(tid,&val);
printf("thread exit,thread id is:%u,exit code is:%d\n",tid,(int)val);
pthread_create(&tid,NULL,thread3,NULL);
sleep(3);
pthread_cancel(tid);
pthread_join(tid,&val);
printf("thread return,thread id is:%u,return code is:%d\n",tid,(int)val);
return 0;
}
運行結果如下:
一般情況下,線程終止后,其狀態一直保留到其他線程調用pthread_join獲取它的狀態為止,但是線程也可以被置為detach狀態,這樣的線程一旦終止,就立刻回收它所占有的所有資源,而不保留終止狀態,不能對一個處于detach狀態的線程調用pthread_join,這樣的調用將返回EINVAL,對一個尚未detach的線程調用pthread_join或pthread_detach都可以把該線程置為detach狀態。也就是說不能對一個線程調用兩次pthread_join 或者已經對一個線程調用了pthread_detach,就不能再調用pthread_join了。
線程分離
在任何一個時間點上,線程是可結合的或者是可分離的,一個可結合的線程能夠被其他線程收回其資源和殺死,在被其他線程收回之前,它的存儲資源是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,他的存儲器資源在它終止時由系統自動釋放。
默認情況下,線程被創建成可結合的,為了避免存儲器泄露,每個可結合線程要么被顯示的回收,要么調用pthread_detach函數被分離。
由于調用pthread_join后,如果該線程沒有運行結束,調用者會被阻塞,我們并不希望如此。我們這時可以在子線程代碼中加入pthread_detach(pthread_self())或者父線程調用pthread_detach(tid).這將子線程的狀態設置為分離的,該線程運行結束后會自動釋放所有資源。
下面我們看一段代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
void *thread(void *arg)
{
pthread_detach(pthread_self());
printf("thread 1 returning....\n");
return NULL;
}
int main()
{
pthread_t tid;
int ret=pthread_create(&tid,NULL,thread,NULL);
if(ret!=0)
{
printf("create thread error,info is :%s\n",strerror(ret));
}
sleep(1);
if(0==pthread_join(tid,NULL))
{
printf("thread wait success\n");
}
else
{
printf("thread wait failed\n");
}
return 0;
}
運行結果:
從結果可以看到,我們在子線程里面用了pthread_detach,在主線程里面又用了pthread_join,所以會wait failed。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。