多執行緒實現多工二
執行緒的常用函式
4)回收執行緒資源
所需標頭檔案:
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:
等待執行緒結束(此函式會阻塞),並回收執行緒資源,類似程式的 wait() 函式。如果執行緒已經結束,那麼該函式會立即返回。
引數:
thread:被等待的執行緒號。
retval:用來儲存執行緒退出狀態的指標的地址。
返回值:
成功:0
失敗:非 0
示例程式碼如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thead(void *arg)
{
static int num = 123; //靜態變數
printf("after 2 seceonds, thread will return\n");
sleep(2);
return #
}
int main(int argc, char *argv[])
{
pthread_t tid;
int ret = 0;
void *value = NULL;
// 建立執行緒
ret = pthread_create(&tid, NULL, thead, NULL);
if(ret != 0){ //建立失敗
perror("pthread_create");
}
// 等待執行緒號為 tid 的執行緒,如果此執行緒結束就回收其資源
// &value儲存執行緒退出的返回值
pthread_join(tid, &value);
printf("value = %d\n", *( (int *)value ) );
return 0;
}
執行結果如下:
建立一個執行緒後應回收其資源,但使用 pthread_join() 函式會使呼叫者阻塞,Linux 還提供了非阻塞函式 pthread_detach() 來回收執行緒的資源。
所需標頭檔案:
#include <pthread.h>
int pthread_detach(pthread_t thread);
功能:
使呼叫執行緒與當前程式分離,分離後不代表此執行緒不依賴與當前程式,執行緒分離的目的是將執行緒資源的回收工作交由系統自動來完成,也就是說當被分離的執行緒結束之後,系統會自動回收它的資源。所以,此函式不會阻塞。
引數:
thread:執行緒號。
返回值:
成功:0
失敗:非 0
注意,呼叫 pthread_detach() 後再呼叫 pthread_join() , pthread_join() 會立馬返回,呼叫失敗。
示例程式碼如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thead(void *arg)
{
int i;
for(i=0; i<5; i++)
{
printf("I am runing\n");
sleep(1);
}
return NULL;
}
int main(int argc, char *argv[])
{
int ret = 0;
pthread_t tid;
ret = pthread_create(&tid, NULL, thead, NULL);
if(ret!=0){
perror("pthread_create");
}
pthread_detach(tid); // 執行緒分離,不阻塞
// 立馬返回,呼叫失敗
int flag = pthread_join(tid, NULL);
if(flag != 0){
printf("join not working\n");
}
printf("after join\n");
sleep(3);
printf("I am leaving\n");
return 0;
}
執行結果如下:
5)執行緒退出
在程式中我們可以呼叫 exit() 函式或 _exit() 函式來結束程式,在一個執行緒中我們可以透過 pthread_exit() 在不終止整個程式的情況下停止它的控制流。
所需標頭檔案:
#include <pthread.h>
void pthread_exit(void *retval);
功能:
退出呼叫執行緒。一個程式中的多個執行緒是共享該程式的資料段,因此,通常執行緒退出後所佔用的資源並不會釋放。
引數:
retval:儲存執行緒退出狀態的指標。
返回值:
無
示例程式碼如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thread(void *arg)
{
static int num = 123; //靜態變數
int i = 0;
while(1)
{
printf("I am runing\n");
sleep(1);
i++;
if(i==3)
{
pthread_exit( (void *)&num );
// return #
}
}
return NULL;
}
int main(int argc, char *argv[])
{
int ret = 0;
pthread_t tid;
void *value = NULL;
ret = pthread_create(&tid, NULL, thread, NULL);
if(ret!=0){
perror("pthread_create");
}
pthread_join(tid, &value);
printf("value = %d\n", *(int *)value );
return 0;
}
執行結果如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657289/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒實現多工一執行緒
- 多工處理方式之二:多執行緒執行緒
- 多執行緒(二)執行緒
- 如何實現多執行緒執行緒
- Python中的多工:多執行緒Python執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- python--多工執行緒Python執行緒
- Java多執行緒的實現Java執行緒
- Java多執行緒實現方式Java執行緒
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Runnable介面實現多執行緒執行緒
- 多執行緒具體實現執行緒
- JSRE中的多工與多執行緒JS執行緒
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- 多執行緒筆記 二執行緒筆記
- 多執行緒學習(二)執行緒
- 多執行緒和多執行緒同步執行緒
- 多執行緒爬蟲實現(上)執行緒爬蟲
- 用Pthread實現多執行緒操作thread執行緒
- 【連載 02】多執行緒實現執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- iOS 多執行緒記錄(二)iOS執行緒
- 多執行緒二 基本技能執行緒
- Java多執行緒(二):Thread類Java執行緒thread
- Java多執行緒的使用(二)Java執行緒
- Java多執行緒之二(Synchronized)Java執行緒synchronized
- 面試-實現多執行緒的方式面試執行緒
- 【QT】QtConcurrent::run()+QThreadPool實現多執行緒QTthread執行緒
- 純Mutex實現多執行緒交替列印Mutex執行緒
- 用多執行緒,實現併發,TCP執行緒TCP
- Python簡單實現多執行緒例子Python執行緒
- Java多執行緒【三種實現方法】Java執行緒
- 多執行緒伺服器的實現執行緒伺服器