LINUX_C 線程總結(一)
首先來說說我所理解的線程:
但是談線程又不得不得提一下進程,程序,這三者的聯繫
或許弄清楚這三種的聯繫之後,我們或許能夠更好的來對這些系統級的實體有一個更加深刻的認知。
- 程序,進程,線程這三者之間的關係?
簡單來說,一程序可以調用多個進程,比如一個視頻播放器程序,裏面就存在兩個進程:一個是播放視頻的進程,一個是下載上傳視頻的進程。
一個進程又同時調用多個線程,
這個線程是隱藏的,用進程管理器看不到,可用其它的進程管理軟件來查看。
三者的邏輯關係是程序調用進程,進程調用線程,一般來說程序下面都是多進程,不同的進程分工不同;進程下面也基本上是多線程的。
可以這樣下定義:進程是系統進行資源分配和調用的獨立單位,每一個進程,都由它自己的內存空間和系統資源
線程是進程的執行單元,執行路徑,線程也是程序使用CPU的最基本單位
學習過程中都能踩了那些坑
i.首先, 就是線程創建函數
c
include
這函數比較坑的一點就是實際用到的時候他的第2,4,項參數是null,那麼問題來了,我想給新開線程從此函數傳參怎麼辦,答案是第四項是參數,傳入他的指針。別在第三項哪裏傳。傳的時候務必注意指針類型問題,先強轉再傳,就不會產生警告,後轉會產生,這是因爲指針字節與你所要轉的大小不同,地址資源浪不匹配。
就是( 指針函數與函數指針的簡單區別):
指針函數:int *f(int a, int b);
函數指針:int (*f)(int a, int b);
>ii線程的屬性超級多 他被包含在一個結構體裏邊, 有時候創建線程的時候也會用到
typedef struct
{
int detachstate; 線程的分離狀態
int schedpolicy; 線程調度策略
struct sched_param schedparam; 線程的調度參數
int inheritsched; 線程的繼承性
int scope; 線程的作用域
size_t guardsize; 線程棧末尾的警戒緩衝區大小
int stackaddr_set;
void * stackaddr; 線程棧的位置
size_t stacksize; 線程棧的大小
}pthread_attr_t;
>iii.線程終止問題,那種好一些
線程有好幾種退出方式,1.return 返回
2. #使用pthread_exit()函數:
有兩種特殊情況要注意,
>1 主線程中,如果從main 函數中返回或者調用了exit函數退出主線程, 則整個進程也會終止,進程實則是主線程, 則整個進程就會終止。
>2 是主線程調用pthread_exit 函數 ,則僅僅是主線程消亡,進程不會結束,進程內的其他線程也不會終止,直到所有線程結束,進程纔會結束。
》》》主要是退出函數的選擇問題 ,具體用到的時候要特別注意。
3. #線程的資源釋放問題
> 線程不會主動釋放資源,所以系統提供了兩個函數
``````
<div class="se-preview-section-delimiter"></div>
#include <pthread.h>
1.void pthread_cleanup_push(void (*routine)(void *), void *arg);
2.void pthread_cleanup_pop(int execute);
這在系統中是一個以宏的形式給出的所以必須成對出現
下一篇會介紹線程同步問題