LINUX_C 線程總結(一)

LINUX_C 線程總結(一)

首先來說說我所理解的線程:
但是談線程又不得不得提一下進程,程序,這三者的聯繫
或許弄清楚這三種的聯繫之後,我們或許能夠更好的來對這些系統級的實體有一個更加深刻的認知。

  1. 程序,進程,線程這三者之間的關係?

簡單來說,一程序可以調用多個進程,比如一個視頻播放器程序,裏面就存在兩個進程:一個是播放視頻的進程,一個是下載上傳視頻的進程。
一個進程又同時調用多個線程,
這個線程是隱藏的,用進程管理器看不到,可用其它的進程管理軟件來查看。
三者的邏輯關係是程序調用進程,進程調用線程,一般來說程序下面都是多進程,不同的進程分工不同;進程下面也基本上是多線程的。
可以這樣下定義:進程是系統進行資源分配和調用的獨立單位,每一個進程,都由它自己的內存空間和系統資源
線程是進程的執行單元,執行路徑,線程也是程序使用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);

這在系統中是一個以宏的形式給出的所以必須成對出現

下一篇會介紹線程同步問題

發佈了39 篇原創文章 · 獲贊 22 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章