摘要
本文概要介紹一個pthread_timedjoin_np的使用範例。本文
Pthread中的pthread_timedjoin_np函式將會嘗試在時限內等待執行緒結束,完整函式說明可以參考這裡;留意,這是一個非標準GNU的延伸,所以函式名稱的尾部有著_np以表示nonportable。以下是一個範例。
主程式具備一個無窮迴圈,從stdin擷取一個使用者輸入的字串後,便以pthread_create建立一個執行緒、且傳入使用者輸入的字串,接著指定等待時間為5秒後便立即透過pthread_timedjoin_np等待剛剛建立的執行緒結束返回;執行緒返回的原因就是pthread_timedjoin_np的回傳值,當回傳值為逾時錯誤時將列印固定的提示字串、而當回傳值為成功時將列印該執行緒的返回內容。執行緒本身將依據輸入引數來決定不同的休眠時間、及返回內容;長短不一的休眠時間是用來測試pthread_timedjoin_np等待時限。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> #include <errno.h> #include <signal.h> #include <pthread.h> static void* prompt_handler(void*); int main(void) { printf("Key-in sentence and press ENTER\n"); for(;;) { char prompt[128] = {'\0'}; char* rp = fgets(prompt, sizeof(prompt), stdin); // '\n' had been included size_t len = strlen(prompt); //get length of the string len -= 1; //remove '\n' prompt[len] = '\0'; //remove '\n' pthread_t t1 = -1; (void)pthread_create(&t1, NULL, prompt_handler, (void*)prompt); struct timespec ts = {.tv_sec = 0, .tv_nsec = 0}; (void)clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 5; //specify timeout ts.tv_nsec += 0; //specify timeout void* pret = NULL; int rc = pthread_timedjoin_np(t1, &pret, &ts); //try to join the thread if(ETIMEDOUT == rc) { printf("response timeout!\n"); } else { if(NULL != pret) { char* responsed = (char*)pret; printf("%s.\n", responsed); } else { printf("response empty!\n"); } } } return EXIT_SUCCESS; } static void* prompt_handler(void* arg) { char* requested_prompt = (char*)arg; char* responsed_prompt = NULL; do { if(NULL == requested_prompt) { break; } if(0 == strcmp("request immediate", requested_prompt)) { sleep(0); responsed_prompt = "response immediate"; } else if(0 == strcmp("request normal", requested_prompt)) { sleep(4); responsed_prompt = "response normal"; } else if(0 == strcmp("request slow", requested_prompt)) { sleep(6); responsed_prompt = "response slow"; } else { responsed_prompt = "response undetermined"; } } while(0); pthread_exit((void*)responsed_prompt); }
程式建構步驟如下所示。
程式執行結果如下所示。
加上了時戳的程式執行結果如下所示。
參考文獻
https://www.freeformatter.com/html-escape.html
沒有留言:
張貼留言