上午聽同事討論關於線程退出的時候是否需要關閉socket控制代碼的問題,之前都是在討論進程退出時,進程會釋放所佔有的所有資源,當然也包括socket 控制代碼資源,關於這點相信大部分人也相當的清楚。
關於線程退出時,socket控制代碼是否也會自動的關閉,我個人認為線程不會自動關閉socket控制代碼線上程退出時,因為線程是公用進程的資源,進程會自動釋放資源很顯然線程就不太可能釋放資源。為此我個人做了一個簡單的測試:
#include
#include
#includevoid *threadfunc(void* arg)
{
int nfd = socket(AF_INET, SOCK_STREAM, 0);
printf("fd=%d time=%d/n",nfd,time(NULL));
close(nfd);
}
int main()
{
pthread_t thid;
pthread_create(&thid,NULL,&threadfunc,NULL);1)
sleep(3);
printf("ddd/n");
pthread_create(&thid,NULL,&threadfunc,NULL);2)
sleep(3);
return 0;
}
在這裡,線程退出時,線程顯示的將socket關閉。1號線程擷取到的socket控制代碼為3(0,1,2前三個控制代碼預設的保留為輸入、輸出、錯誤輸出),2號線程擷取的socket據也為3;、
#include
#include
#include
void *threadfunc(void* arg)
{
int nfd = socket(AF_INET, SOCK_STREAM, 0);
printf("fd=%d time=%d/n",nfd,time(NULL));
}
int main()
{
pthread_t thid;
pthread_create(&thid,NULL,&threadfunc,NULL);3)
sleep(3);
printf("ddd/n");
pthread_create(&thid,NULL,&threadfunc,NULL);4)
sleep(3);
return 0;
}
這段代碼與上面的不同之處在於,線上程退出時,沒有關閉開啟的socket控制代碼,輸出的結果為:3、4。
為此,我們可以可以總結出,線上程退出時,線程並沒有自動關閉線程中的socket控制代碼。所以才會出現輸出結構為3、4。