對線程等待函數pthread_join二級指針參數分析

分析以前先搞明白,這個二級指針其實在函數內部是承接了上個線程的返回值。

看man手冊,發現返回值是個普通指針。人家用二級指針來承接,可能準備幹大事。這個能夠本身搜索一下。緣由嘛,二級指針是保存了這個地址。一級指針承接的話就是這個地址。函數

那既然二級指針保存了,咱們如何訪問那?開始我以爲直接來個二級指針,而後*訪問算了,可是下面的東西。讓你不能那麼幹了!其實非要那樣也能夠 malloc唄!post

線程建立函數pthread_create的函數原型以下:線程

int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);
指針

 

其中,thread是要建立的線程;rest

         attr指定線程的屬性,缺省值爲NULL;blog

          start_routine是線程要執行的函數;原型

          arg是傳遞給線程執行的函數的參數;string

要注意的是:start_routine是函數指針it

 

線程等待函數pthread_create的函數原型以下:io

 

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

 

其中,thread是要等待的線程名;

         value_ptr:指針*value_ptr指向線程返回的參數

 

在使用時要注意的是:針對value_ptr,應該先聲明一個一級指針,而後經過取地址的方式傳給pthread_create函數,而不該該直接定義一個二級指針,將這個二級指針直接傳遞給pthread_create。

如:

正確的傳遞方法:

void *ret;

pthread_join(thread, &ret);

錯誤的傳遞方法:

void **ret;

pthread_join(thread, ret);

 

緣由:pthread_join中有一句類型這樣的語句:(* value_ptr) = arg;若是按照正確的方式傳遞參數,左邊的語句實際上完成的操做是:ret = arg;一點問題沒有。可是,當按照錯誤的方式傳遞參數時,會出現一句致命的錯誤:(* value_ptr),它對一個尚未初始化的指針進行了取值操做,這是系統所不容許的,此時(* value_ptr)等價於*ret,*ret仍是一個指針,是一個二級指針,可是*ret是一個野指針!

 

注意啊!你返回的是一個一級指針,那麼存儲就只能是用 * &ret 來存儲(但願你懂,就是指針降級)=ret;

那麼輸出天然也就是 ret了。

 

下面是一個例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

#define N 64

int a = 10;
void * handler(void *arg)
{
printf("a=%d, %s\n", a, (char *)arg);
strcat((char *)arg, " ......");
pthread_exit(arg);
}

int main()
{
pthread_t tid;
char buf[N] = {"welcome"};
void *result;

if (pthread_create(&tid, NULL, handler, (void *)buf) != 0) exit(-1); printf("*\n"); pthread_join(tid, &result); printf("ret:%s\n", (char *)result); return 0;}

相關文章
相關標籤/搜索