2017年3月21日 星期二

thread - pthread (POSIX Threads) linux 實作 pthread 基礎

Pthread:
POSIX執行緒(POSIX Threads,常被縮寫為Pthreads)是POSIX的執行緒標準,定義了創建和操縱執行緒的一套API。

Pthreads定義了一套C語言的類型、函數與常量,它以pthread.h頭文件和一個執行緒庫實現。
pthread可以分為四類:
執行緒管理:例如創建執行緒,等待(join)執行緒,查詢執行緒狀態等。
互斥鎖(Mutex):創建、摧毀、鎖定、解鎖、設置屬性等操作。
條件變量(Condition Variable):創建、摧毀、等待、通知、設置與查詢屬性等操作
使用了互斥鎖的執行緒間的同步管理。

POSIX的Semaphore API可以和Pthreads協同工作,但這並不是Pthreads的標準。因而這部分API是以"sem_"打頭,而非"pthread_"。

而最基本的就是 Pthread 的管理,先從這個部分來做初學會比較容易理解。

Pthread  管理API(較常用):
pthread_create
int pthread_create(pthread_t *tid , const pthread_attr_t *attr , void *(*function)(void *) , void *argument)

這個Function的作用是用來產生一個Thread並執行附帶的Function,附帶有4個參數。

參數1. pthread_t *tid為pthread的指標,在使用Thread之前必須要先宣告一個pthread_t的變數。參數2. const pthread_attr_t *attr為該Thread的屬性,預設是NULL,如果沒有其他特殊的需求直接填入NULL即可。
參數3. void *(*function)(void *)為Function pointer,這邊要放入你要執行的Function。
參數4. void *argument為Function pointer所要帶的參數。

回傳值: 如果執行成功則回傳0,如果執行失敗則回傳錯誤代碼。
example: pthread_create( &thread1, NULL , showmessage , message);

pthread_exit
void pthread_exit (void *value_ptr)
這個Function的作用是用來關閉一個Thread,附帶有1個參數。

參數1: void *value_ptr用來設定執行成功時該Thread會回傳的值,這個值可由pthread_join()這個Function來取得。

回傳值: 不會回傳任何值。
example: pthread_exit(NULL);

pthread_cancel
int pthread_cancel (pthread_t thread)
這個Function的作用是用來關閉一個指定的Thread,附帶有一個參數。

參數1: pthread_t thread為要關閉的Thread。

回傳值: 如果執行成功則回傳0,如果執行失敗則回傳錯誤代碼。
example: pthread_cancel(thread1);

pthread_join
int pthread_join (pthread_t thread, void **value_ptr)

這個Function的作用會暫停目前執行pthread_join的Thread,等到目標Thread執行完畢之後目前執行pthread_join的Thread才會繼續執行,附帶有2個參數。

參數1: pthread_t thread為要等待的目標Thread。
參數2: void **value_ptr用來取得目標Thread的回傳值。

回傳值: 如果執行成功則回傳0,如果執行失敗則回傳錯誤代碼。


可以從example 1的範例中來觀察如何創造管理pthread 實作上面提到的API。


example 1

#include <stdio.h>
#include <pthread.h>

void *show_message( void *ptr )
{
     char *message;
     message = (char *) ptr;
     int x = 5;
     for(x = 5 ; x > 0 ; --x){
        printf("%s \n", message);    
        _sleep(300);
     }
     pthread_exit((void *)1234);
}

int main(){
   pthread_t thread1;
   char *message1 = "Thread 1";
   void *ret;

   pthread_create(&thread1, NULL , show_message , (void*) message1);
   pthread_join( thread1, &ret);
   printf("return value from thread1 = %d\n",ret);
   system("pause");

   return 0;
}        


******************************************************************************
output:
Thread 1
Thread 1
Thread 1
Thread 1
Thread 1
return value from thread1 = 1234

reference:wiki-pthreadnikoung的網路日誌

沒有留言:

張貼留言

linux - IPC (inter-processes communication) Shered mempry(共用記憶體)

IPC (inter-processes communication) 顧名思義,processes 之間溝通的管道&機制。 Shared memory   程式間可以共享memory Message Queue  程式間傳送資訊最簡單的方法 Semaphore...