引言
通過幾個實驗練習,學習線程之間連接的具體實現。下面列舉了兩個例子,一個是子線程返回簡單數據類型;另一個是子線程返回複雜數據類型。
實現代碼
子線程返回簡單的數據類型
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
// int a=20;
void* ThreadEntry(void*arg)
{
int count=0;
// int a=20;
// int*p=&a;
int *p=(int*)malloc(sizeof(int));
*p=10;
while(1)
{
++count;
if(count>=5)
pthread_exit(p);
printf("I am thread\n");
sleep(1);
}
}
int main()
{
pthread_t threadId;
void *ret;
int error;
error=pthread_create(&threadId, NULL, ThreadEntry, NULL);
if(error)
{
printf("Thread create error!\n");
exit(1);
}
printf("I am main\n");
pthread_join(threadId, &ret);
printf("ret=%d\n", *(int*)ret);
return 0;
}
注意
當在子線程調用作爲參數的函數中使用int a = 20; int *p = &a;
這種方式,將會導致輸出的ret是一個不確定的值,這是因爲p指向了一個局部變量,當函數調用結束該變量就會被釋放,造成指針懸掛。
所以需要採用全局變量或動態分配的方式解決這個問題。當p指向了一個全局變量,雖然子線程調用結束,但是返回的指針所指向的內存區域未被釋放;當p指向了一個動態分配的存儲空間的,保證了返回的指針所指向的內容對應的內存空間不會因爲子線程的結束而被釋放,從而得到預期結果。
pthread_exit()
- 功能:終止線程
- 函數聲明:
void pthread_exit(void *value_ptr) - 參數說明:
value_ptr:不要指向一個局部變量
要結束一個線程,只需要在線程調用的函數中加入 pthread_exit(X) 即可,但有一點需要特別注意:如果一個線程是非分離的(默認情況下創建的線程都是非分離)並且沒有對該線程使用 pthread_join() 的話,該線程結束後並不會釋放其內存空間。這會導致該線程變成了“殭屍線程”。“殭屍線程”會佔用大量的系統資源,因此我們要避免“殭屍線程”的出現。
pthread_join()
- 功能 :pthread_join()函數,以阻塞的方式等待thread指定的線程結束。當函數返回時,被等待線程的資源被收回。如果線程已經結束,那麼該函數會立即返回。
- 頭文件 : #include <pthread.h>
- 函數聲明:int pthread_join(pthread_t thread, void **retval);
- 參數說明:thread: 線程標識符,即線程ID,標識唯一線程。retval: 用戶定義的指針,用來存儲被等待線程的返回值。
返回值 : 0代表成功,非0是失敗。
最後
- 由於博主水平有限,難免有疏漏之處,歡迎讀者批評指正!