日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言由淺入深講解線程的定義_C 語言

作者:Gy648 ? 更新時間: 2022-07-02 編程語言

線程的概念

可以簡單理解為一個正在獨立運行的函數

注:

1.posix線程是一套標準嗎,而不是實現

2.線程標識: phread_t,可能是整形也可能是結構體指針等

*簡單介紹關于線程標識的函數*
?*pthread_equarl() ;判斷兩個線程標識是否相等*
*pthread_self();返回自身的線程標識*?

線程的創建

pthread_creat();

int pthread_create(

pthread_t *restrict tidp, //新創建的線程ID指向的內存單元。

const pthread_attr_t *restrict attr, //線程屬性,默認為NULL

void *(*start_rtn)(void *), //新創建的線程從start_rtn函數的地址開始運行

void *restrict arg //默認為NULL。若上述函數需要參數,將參數放入結構中并將地址作為arg傳入。);

線程的調度取決于調度器策略

# include<stdlib.h>
# include<pthread.h>
static void* func(void* p)
{
 puts("thread is working");
 return NULL;
}
int main()
{
  pthread_t tid;
  int err;
  puts("begin!");
  err = pthread_create(&tid,NULL,func,NULL);
  if(err)
  {
   exit(-1);
  }
  puts("end!");
  exit(0);
}

線程的終止

3種方式 :

1)線程從啟動歷程返回,返回值就是線程的退出碼

2)線程可以被同一進程中的其他線程取消

3)線程可以調用 pthread)exit()函數

線程退出函數

void pthread_exit(void *value_ptr);

線程標識的比較

獲取線程號

pthread_t pthread_self(void);

比較

int pthread_equal(pthread_t t1, pthread_t t2);

線程的取消

int pthread_cancel(pthread_t thread);

取消有兩種狀態 : 允許和不允許

允許取消又分為: 異步cancel , 推遲 cancel(默認) -> 推遲到cancel點

cancel點: posix定義的canceldian 都是可能引發阻塞的系統調用

pthread_setcancelstate(int );//設置是否允許取消

pthread_setcanceltype(); //設置取消方式 異步還是推遲

注:pthread_cancel 調用具有具有一定的延時性,因為cancel點: posix定義的canceldian 都是可能引發阻塞的系統調用,并不會立即被處理,不建議當線程立即被創建后立即進行cancel取消(線程創建,并不會立即被調度);也不建議在線程退出前執行線程cancel取消(線程可能在取消之前就已經退出了);建議在線程執行中進行cancel取消線程

void pthread_testcancel(void); //本函數為設置取消點

當不關心線程的返回信息時可以直接使用線程分離函數進行回收

反之,需要獲取線程的返回值時,可以使用線程等待

線程等待

int pthread_join(pthread_t thread, void **value_ptr);

第一個參數是線程標識,第二是傳出型參數用來獲取線程的返回值

注意:

  • 調用該函數的線程將掛起等待,直到id為thread的線程終止
  • 這里獲取的線程退出信息并沒有終止信號信息,而終止信號信息是對于整個進程來說的,如果線程收到信號崩潰也會導致整個進程也崩潰
  • thread線程以不同的方法終止,通過pthread_join得到的終止狀態是不同的

終止獲取的狀態情況:

  • 如果thread線程通過return返回,value_ ptr所指向的單元里存放的是thread線程函數的返回值
  • 如果thread線程被別的線程調用pthread_ cancel異常終掉,value_ ptr所指向的單元里存放的是常數PTHREAD_ CANCELED
  • 如果thread線程是自己調用pthread_exit終止的,value_ptr所指向的單元存放的是傳給pthread_exit的參數
  • 如果對thread線程的終止狀態不感興趣,可以傳NULL給value_ ptr參數

線程分離

int pthread_detach(pthread_t thread);

默認情況下,新創建的線程是joinable的,線程退出后,需要對其進行pthread_join操作,否則無法釋放資源,從而造成系統泄漏

如果不關心線程的返回值,join是一種負擔,這個時候,我們可以告訴系統,當線程退出時,自動釋放線程資源

注:

可以是線程組內其他線程對目標線程進行分離,也可以是線程自己分離:

pthread_detach(pthread_self());

joinable和分離是沖突的,一個線程不能既是joinable又是分離的

線程的分離也是具有一定延時性,分離之后如果再進行等待那么得到返回的結果是未定義的

線程分離后只是回收的時候自動進行回收,如果主線程先退出,那么整個進程也會退出;如果分離的線程執行崩潰,同樣的整個進行也會崩潰

原文鏈接:https://blog.csdn.net/m0_63515013/article/details/124393409

欄目分類
最近更新