1. 程式人生 > >pthread_create函式的詳細講解(包括向執行緒函式傳遞引數詳解)

pthread_create函式的詳細講解(包括向執行緒函式傳遞引數詳解)

pthread_create是UNIX環境建立執行緒函式

標頭檔案

  #include<pthread.h>

函式宣告

  int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

返回值

  若成功則返回0,否則返回出錯編號   返回成功時,由tidp指向的記憶體單元被設定為新建立執行緒的執行緒ID。attr引數用於制定各種不同的執行緒屬性。新建立的執行緒從start_rtn函式的地址開始執行,該函式只有一個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止一個,那麼需要把這些引數放到一個結構中,然後把這個結構的地址作為arg的引數傳入。
  linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。   由 restrict 修飾的指標是最初唯一對指標所指向的物件進行存取的方法,僅當第二個指標基於第一個時,才能對物件進行存取。對物件的存取都限定於基於由 restrict 修飾的指標表示式中。 由 restrict 修飾的指標主要用於函式形參,或指向由 malloc() 分配的記憶體空間。restrict 資料型別不改變程式的語義。 編譯器能通過作出 restrict 修飾的指標是存取物件的唯一方法的假設,更好地優化某些型別的例程。

引數

  第一個引數為指向執行緒識別符號
的指標。
  第二個引數用來設定執行緒屬性。   第三個引數是執行緒執行函式的起始地址。   最後一個引數是執行函式的引數。   另外,在編譯時注意加上-lpthread引數,以呼叫靜態連結庫。因為pthread並非Linux系統的預設庫

示例

  列印執行緒 IDs   #include <pthread.h>   #include <stdlib.h>   #include <stdio.h>   #include <unistd.h>   #include <string.h>   pthread_t ntid;
  void printids(const char *s)   {   pid_t pid;   pthread_t tid;   pid = getpid();   tid = pthread_self();   printf("%s pid %u tid %u (0x%x)\n", s,   (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);   } void *thr_fn(void *arg)   {   printids("new thread: ");   return((void *)0);   }   int main(void)   {   int err;   err = pthread_create(&ntid, NULL, thr_fn, NULL);   if (err != 0)   printf("can't create thread: %s\n", strerror(err));   printids("main thread:");   sleep(1);   exit(0);   }   $ gcc main.c -lpthread

  $ ./a.out

向執行緒函式傳遞引數詳解:

向執行緒函式傳遞引數分為兩種:

(1)執行緒函式只有一個引數的情況:直接定義一個變數通過應用傳給執行緒函式。

例子:

#include <iostream>
#include <pthread.h>
using namespace std;
pthread_t thread;
void fn(void *arg)
{
    int i = *(int *)arg;
    cout<<"i = "<<i<<endl;
    return ((void *)0);
}
int main()
{
    int err1;
    int i=10;
   err1 = pthread_create(&thread, NULL, fn, &i);
    pthread_join(thread, NULL);
}
2、執行緒函式有多個引數的情況:這種情況就必須申明一個結構體來包含所有的引數,然後在傳入執行緒函式,具體如下:

例子:

首先定義一個結構體:

struct  parameter

{

  int size,

  int count;

。。。。。

。。。 
};

然後在main函式將這個結構體指標,作為void *形參的實際引數傳遞

struct parameter arg;

通過如下的方式來呼叫函式:
pthread_create(&ntid, NULL, fn,& (arg));
函式中需要定義一個parameter型別的結構指標來引用這個引數 

void fn(void *arg)
{
    int i = *(int *)arg;
    cout<<"i = "<<i<<endl;
    return ((void *)0);
}

void thr_fn(void *arg)
{
       struct parameter *pstru;
       pstru = ( struct parameter *) arg;
       然後在這個函式中就可以使用指標來使用相應的變數的值了。
}