日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2023/11/30 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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释放线程资源的全部內容,希望文章能夠幫你解決所遇到的問題。

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