2019/06/28

一個pthread_timedjoin_np的範例

摘要

本文概要介紹一個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


沒有留言:

張貼留言