星期一, 3月 06, 2017

[ C ] pthread_create 用法 (一) 基本




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

1. thread : thread id (pthread_t)
2. *attr : thread 屬性
3. function name
4. 傳給function的參數

Note:
因為參數是利用指標方式傳,所以可定義成struct來傳遞多個參數。

在compile時記得加上-pthread
/ # gcc -pthread Pthread.c

如果create成功會回傳0,如果失敗會回傳錯誤代碼。

範例程式主要是從call function時分別印出三個數字,

pthread_create(&thread, NULL, hello, (void *)&i);

然後我用&i傳遞變數i的位址,
hello function內用void *data來接收,

代表我取得傳來的指標位址,
但這時還不知道傳來的是什麼類型的指標位址,
所以用(int *)強制轉型成,當作傳來的是int 的位址來接收。

int i = *((int *)data);

然後用* 來取他的值,所以i 的值就為data所指向的位址的值。

之後再印出i 的值出來。

printf("Hello %d\n", i);

這樣執行完的結果會是看不到任何數字 !!

因為程式把要做的事丟去給thread做,之後就直接結束,
所以我們還來不及看到結果時,就結束了。

這時我在第22行加上pthread_join()來等這個thread id執行完。

rc = pthread_join(thread, NULL);

然後就會印出
Hello 3
Hello 3
Hello 3

這是因為我們傳送&i 到function內,
而在他來不及印出來時,原本的i值就早被累加到3了
因為i 累加到3,因為等於3,所以跳出,
可是i 這時已經到3了。

那這次己成用第19行,每次create thread就會等他回來,
所以印出來的值就正確了。
Hello 0
Hello 1
Hello 2


SourceCode

Ref_1
Ref_2

沒有留言: