引言
通過幾個實驗練習,學習線程之間連接的具體實現。下面列舉了兩個例子,一個是子線程返回簡單數據類型;另一個是子線程返回複雜數據類型。
實現代碼
子線程返回複雜數據類型
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
struct member {
int a;
char *b;
};
void *create(void *arg) {
struct member *temp = (struct member*)malloc(sizeof(struct member));
temp->a = 2;
temp->b = "HelloWorld!";
printf("Thread created successfully\n");
return (void*)temp;
}
int main(int argc, char *argv[]) {
int error;
pthread_t threadId;
struct member *c;
error = pthread_create(&threadId, NULL, create, NULL);
if(error) {
printf("Thread create error!\n");
exit(1);
}
printf("I am main\n");
error = pthread_join(threadId, (void**)&c); //注意pthread_join()的函數聲明
if(error) {
printf("Thread is not exit!\n");
exit(1);
}
printf("c->a = %d \n", c->a);
printf("c->b = %s \n", c->b);
sleep(1);
return 0;
}
注意
- 這裏定義存儲被等待線程的返回值的指針爲
struct member *c;
要注意在pthread_join()中進行強制類型轉換,即將member**
轉換爲void**
。具體代碼爲(void**)&c
,其中&c
爲member**
類型。 - 在子線程調用作爲參數的函數內,要注意返回變量的生命週期。這裏採用了動態分配存儲空間的方式,保證了返回的指針所指向的內容對應的內存空間不會因爲子線程的結束而被釋放,從而得到預期結果。
pthread_join()
功能 :pthread_join()函數,以阻塞的方式等待thread指定的線程結束。當函數返回時,被等待線程的資源被收回。如果線程已經結束,那麼該函數會立即返回。
頭文件 : #include <pthread.h>
函數聲明:int pthread_join(pthread_t thread, void **retval);
參數說明:thread: 線程標識符,即線程ID,標識唯一線程。retval: 用戶定義的指針,用來存儲被等待線程的返回值。
返回值 : 0代表成功,非0是失敗。
最後
- 由於博主水平有限,難免有疏漏之處,歡迎讀者批評指正!