線程的終止分離

1.線程的終止

????????????????這里寫圖片描述
????注意該函數是針對用戶級別的, 其中 retal 必須指向一個全局變量, 或者是一個 malloc 分配的, 因為如果是線程的局部變量, 當該線程退出時, 其他線程不能得到這個變量, 因為線程的局部變量各自私有

2. 現成的取消

????????????????這里寫圖片描述
????其中thread是線程的 tid

3.線程的等待與分離

????(1)線程的等待
????????????????這里寫圖片描述
????注意已經退出的線程它的空間并沒有被釋放, 它所占有的空間仍然在進程內部, 并且進程創建的新的線程不會復用退出線程的空間, 因此對于已經推出的線程而言, 它所占有的空間必須由主線程將其回收. 因為如果主線程不對退出的線程進行空間回收的, 會造成資源泄露.
????上面函數中 thread是線程的tid, 而retval 是一個指針, 這個指針指向一個指針, 它所指向的這個指針指向線程的返回值(對retval進行一次解引用, 可以獲取到線程的返回值), 同樣成功時返回 0, 失敗時返回錯誤碼.. 調用該函數的線程將會被掛起等待, 直到 id 為thread 的線程終止.
????線程退出的幾種情況
????1)代碼跑完結果正確,
????2)代碼跑完結果錯誤
????線程通過不同方式退出, retval所指向的內容是不同的
????1)如果線程線程是調用了return 終止(主線程不能用, 因為main 函數調用return相當于進程退出), retval 指向線程函數的返回值
????2)如果線程被其他線程調用了 pthread_cancle , 此時 retval 會指向一個常數, PTHREAD_CANCLED, 該常數是被進行了宏定義為 -1
????3)如果該函數是自己調用了 pthread_exit, retval 指向傳給pthread_exit 的參數的地址
????4)如果對線程的退出狀態不關心, 此時retval可以被設為 NULL
來看一段代碼

#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>void* thread1(void* arg)
{printf("I am thread1\n");int* p = (int*)malloc(sizeof(int));*p = 1;return (void*)p;
}void* thread2(void* arg)
{printf("I am thread2\n");int* p = (int*)malloc(sizeof(int));*p = 2;pthread_exit((void*)p);
}void* thread3(void* arg)
{while(1){printf("I am thread3\n");sleep(1);}return NULL;
}
int main()
{pthread_t tid;void* ret;pthread_create(&tid, NULL, thread1, (void*)1);pthread_join(tid, &ret);printf("tid = %x, ret = %d\n", tid, *(int*)ret);pthread_create(&tid, NULL, thread2, NULL);pthread_join(tid, &ret);printf("tid = %x, ret = %d\n", tid, *(int*)ret);pthread_create(&tid, NULL, thread3, NULL);sleep(3);pthread_cancel(tid);pthread_join(tid, &ret);if(ret == PTHREAD_CANCELED){printf("tid = %x, ret = %d\n", tid, PTHREAD_CANCELED);}return 0;
}

??????????????????????????????這里寫圖片描述
????由上圖可以看出, 由于線程的終止方式采用了不同的方式終止, 一次返回值 ret 所指向的單元存放的信息也是不同的.而其中的 tid 是相同的那是因為 pthread_create 是用戶級別的調用, 而在用戶眼里,這個 tid 就是一個地址
????(2)線程的分離
????默認情況下, 線程是可分離的(線程在退出時必須對其空間進行回收, 否則會造成內存泄露), 因此必須對線程進行等待, 但是當我們不再關心線程的返回值的時候, 此時我們就可以對線程進行分離. 即當線程退出的時候, 我們可以采用一種機制, 告訴操作系統, 該線程就要退出了, 此時, 操作系統便可以在線程退出時自動將該線程的資源釋放.其中一個線程可以被別的線程分離, 也可以自己分離自己
??????????????????????????????這里寫圖片描述
??????????????????????????????這里寫圖片描述
????其中 pthrea_self 用來獲取線程自身的 tid

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<string.h>
#include<stdlib.h>void* thread1(void* arg)
{printf("%s\n", (char*)arg);pthread_detach(pthread_self());return NULL;
}
int main()
{pthread_t thread;int result;void* ret;if(pthread_create(&thread, NULL, thread1, "thread1 is running") != 0){printf("create thtread is failed\n");return 1;}sleep(1);if(pthread_join(thread, NULL) == 0){printf("wait thread is sucessful\n");result = 0;}else{printf("wait thread is failed\n");result = 1;}return result;
}

??????????????????????????????這里寫圖片描述
????在上圖中, 由于線程已經分離, 但是我們還對其進行 join, 此時必定join 失敗, 即對一個已經分離的線程不能再進行 join

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384038.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UVa10082

【題目描述】 傳送門 【題目分析】 同樣是一道模擬&#xff0c;但是如何巧妙快速的解決仍然不簡單。通過這道題告訴我們對于復雜確定的對應關系我們要靈活運用常量數組。 同時還需要注意的一個小問題就是字符串數組中的"//"指的是轉義后的單斜杠&#xff0c;如果只…

C語言中的深拷貝和淺拷貝

http://www.cnblogs.com/zhanggaofeng/p/5421804.html C語言中的深拷貝和淺拷貝 //C語言中的深拷貝和淺拷貝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct _student{char name[30];char *title;…

死鎖的產生和避免

1.死鎖產生的四個必要條件 (1)互斥條件&#xff1a;資源是獨占的且排他使用&#xff0c;進程互斥使用資源&#xff0c;即任意時刻一個資源只能給一個進程使用&#xff0c;其他進程若申請一個資源&#xff0c;而該資源被另一進程占有時&#xff0c;則申請者等待直到資源被占有者…

UVa401

【題目描述】 傳送門 【題目描述】 嘻嘻&#xff0c;自己做直接AC還是比較開心的。當然有一部分原因是之前看書的時候詳細看過這個題的代碼&#xff0c;但是這已經快一年了&#xff0c;應該說做出這道題憑借的是自己的能力吧。回過身去看了一下書中的代碼發現自己寫的不算復…

gethostbyname() 函數說明

https://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函數說明——用域名或主機名獲取IP地址 包含頭文件#include <netdb.h>#include <sys/socket.h>函數原型struct hostent *gethostbyname(const char *name);這個函數的傳入值是域…

求解迷宮最短路徑

1. 多通路迷宮初始化 先構建一個多通路迷宮,并且對其初始化 void MazeInitShortPath(Maze* maze) {if(maze NULL){return;}int row 0;int col 0;for(; row < MAX_COL; row){for(col 0; col < MAX_COL; col){maze -> map[row][col] Map[row][col];}printf("…

UVa340

【題目描述】 傳送門 【題目分析】 題目理解以后十分簡單&#xff0c;但是這題面實在讓人自閉&#xff0c;這么簡單的題目啦啦啦啦說了那么多&#xff0c;實在是看不懂。&#xff08;幸虧我看了書理解了題目的意思&#xff0c;要不然。。&#xff09;還是要鍛煉自己的讀題能…

C語言:結構體中一級指針和二級指針的創建與釋放示例

http://blog.csdn.net/Bixiwen_liu/article/details/53610952 這幾天把C語言鞏固了一下&#xff0c;作為一門最基本的編程語言&#xff0c;C語言還是相當基礎和非常重要的&#xff0c;個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指針和二級指針的…

帶環迷宮求最短路徑

前面介紹了簡單的迷宮求解問題, 今天我們就對帶環迷宮求出它的最短路徑 1.首先來看一個帶環迷宮的簡單地圖 在這張迷宮地圖中,我們規定入口點的位置entry的坐標是 (0, 1), 同時, 我們給入口點傳一個非法坐標,作為入口點的前一個位置(-1, -1). 接下來的思路就和上一篇的思路是一…

UVa1583

【題目描述】 傳送門 【題目分析】 我以為很簡單就寫了一個暴力沒有想到超時了。應該是T是非常大的所以必須得打表&#xff0c;將所有的結果都儲存起來然后直接輸出。 以后遇到這種可以一下算出所有結果的多組數據最好還是算出所有的結果然后再輸出答案。 【AC代碼】 #inc…

C 結構體嵌套一級指針 二級指針 動態分配內存

https://blog.csdn.net/xielinhua88/article/details/51364623 點擊打開鏈接 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //結構體嵌套一級指針 二級指針 動態分配內存 typedef struct _Teacher { int ag…

線程的同步與互斥

1. 互斥量 在Linux 下線程使用的都是局部變量, 而我們知道, 每一個線程都獨立擁有自己的一個棧, 而這些局部便令就在棧中,而線程的創建就是為了實現通信, 此時線程之間無法共享這些變量 ????為了使得線程之間能夠共享數據, 一次我們可以創建一個全局變量, 此時線程都在進程…

二級指針與指針數組的關系

http://blog.csdn.net/shuaishuai80/article/details/6129742 #include <stdio.h> void test(char *argv[]); int main(void) { char *argv[3]{{"abcdefg"},{"1234567"},{"q1w2e3r"}}; test(argv); /*調用指針數組…

UVa1584

【題目描述】 傳送門 【題目分析】 也是一道簡單的模擬題&#xff0c;1A嘿嘿嘿。 再看書發現和書上的做法差不多。 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstd…

cf#582div3 D——暴力

【題目描述】 The only difference between easy and hard versions is the number of elements in the array.You are given an array a consisting of n integers. In one move you can choose any ai and divide it by 2 rounding down (in other words, in one move you c…

C語言 可變參數

http://www.cnblogs.com/zhanggaofeng/p/6434554.html //可變參數 #include <stdio.h> #include <stdlib.h> #include <string.h> //引用頭文件 #include <stdarg.h>/* va_list用于聲明一個變量&#xff0c;我們知道函數的可變參數列表其實就是一個字符…

UVa1585

【題目描述】 傳送門 【題目分析】 氵 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<set> #include<map> #include<vector>u…

c語言經典算法——查找一個整數數組中第二大數

https://www.cnblogs.com/dootoo/p/4473958.html 題目&#xff1a; 實現一個函數&#xff0c;查找一個整數數組中第二大數。 算法思想&#xff1a; 設置兩個變量max1和max2&#xff0c;用來保存最大數和第二大數&#xff0c;然后將數組剩余的數依次與這兩個數比較&#xff0c;如…

進程間關系和守護進程

一. 進程組/作業/會話 1.進程組 每一個進程除了有一個進程ID之外, 還屬于一個進程組. 進程是一個或多個進程的集合. 通常, 它們與同一個作業向關聯, 可以接收來自同一個終端下的各種命令,信號. 每一個進程組都有唯一的進程組 ID. 每一個進程組都可以有一個組長進程. 組長進程的…

UVa1586

【題目描述】 傳送門 【題目分析】 氵 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<set> #include<map> #include<vector> …