日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pthread创建线程后必须使用join或detach释放线程资源

發布時間:2023/11/30 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pthread创建线程后必须使用join或detach释放线程资源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天在看Pthread 資料的時候,無意中看到這樣一句話(man pthread_detach):

Either pthread_join(3) or pthread_detach() should be called for each thread
that an application creates, so that system resources for the thread can be
released. (But note that the resources of all threads are freed when the
process terminates.)

也就是說:每個進程創建以后都應該調用pthread_join 或 pthread_detach 函數,只有這樣在線程結束的時候資源(線程的描述信息和stack)才能被釋放.

之后又查了pthread_join?但是沒有明確說明必須調用pthread_join 或 pthread_detach.

但是再查了 Pthread for win32?pthread_join

When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore,?pthread_join must be called? once? for?each joinable thread created to avoid?memory leaks.


才知道如果在新線程里面沒有調用pthread_join 或 pthread_detach會導致內存泄漏, 如果你創建的線程越多,你的內存利用率就會越高, 直到你再無法創建線程,最終只能結束進程。
解決方法有三個: 1. ? 線程里面調用?pthread_detach(pthread_self())?這個方法最簡單 2.?在創建線程的設置PTHREAD_CREATE_DETACHED屬性 3.?創建線程后用?pthread_join()?一直等待子線程結束。
下面是幾個簡單的例子 1.?調用??pthread_detach(pthread_self()) #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *PrintHello(void) { pthread_detach(pthread_self()); int stack[1024 * 20] = {0,}; //sleep(1); long tid = 0; //printf(“Hello World! It’s me, thread #%ld!\n”, tid); //pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t pid; int rc; long t; while (1) { printf(“In main: creating thread %ld\n”, t); rc = pthread_create(&pid, NULL, PrintHello, NULL); if (rc){ printf(“ERROR; return code from pthread_create() is %d\n”, rc); //exit(-1); } sleep(1); } printf(” \n— main End —- \n”); pthread_exit(NULL); } 2.?在創建線程的設置PTHREAD_CREATE_DETACHED屬性 #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *PrintHello(void) { int stack[1024 * 20] = {0,}; //pthread_exit(NULL); //pthread_detach(pthread_self()); } int main (int argc, char *argv[]) { pthread_t pid; int rc; long t; while (1) { printf(“In main: creating thread %ld\n”, t); pthread_attr_t attr; pthread_t thread; pthread_attr_init (&attr); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); rc = pthread_create(&pid, &attr, PrintHello, NULL); pthread_attr_destroy (&attr); if (rc){ printf(“ERROR; return code from pthread_create() is %d\n”, rc); //exit(-1); } sleep(1); } printf(” \n— main End —- \n”); pthread_exit(NULL); } 3. 創建線程后用?pthread_join() 一直等待子線程結束。
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *PrintHello(void) { int stack[1024 * 20] = {0,}; //sleep(1); long tid = 0; //pthread_exit(NULL); //pthread_detach(pthread_self()); } int main (int argc, char *argv[]) { pthread_t pid; int rc; long t; while (1) { printf(“In main: creating thread %ld\n”, t); rc = pthread_create(&pid, NULL, PrintHello, NULL); if (rc){ printf(“ERROR; return code from pthread_create() is %d\n”, rc); //exit(-1); } pthread_join(pid, NULL); sleep(1); } printf(” \n— main End —- \n”); pthread_exit(NULL); }

總結

以上是生活随笔為你收集整理的Pthread创建线程后必须使用join或detach释放线程资源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。