星期一, 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
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言