【Linux】信號(二):Linux原生線程庫相關接口

【Linux】信號的控制使用

  • 一.線程的創建
    • pthread_create()接口
  • 二.線程等待
    • 1.為什么要線程等待?
    • 2.pthread_join()
  • 三.線程中止
    • 1.return
    • 2.pthread_exit
  • 五.線程應用
    • C++自帶多線程

在上次的博客中主要講解了什么是線程
這次的博客主要是帶大家把線程的相關接口簡單的使用一下

這次博客的篇幅不長,就單純了解接口的,之后的博客才會來主要剖析線程

首先在Linux中有一個原生線程庫
Linux中沒有線程的概念,但是用戶肯定是需要線程這個東西的

所以說Linux中有一個原生線程庫(基本上所有的Linux中都有)
叫做pthread.h,正是這個原生線程庫給用戶提供了Linux中的線程的這個概念

這個博客接下來就是帶大家來認識一下比較常用的原生線程庫中的接口的

一.線程的創建

pthread_create()接口

在這里插入圖片描述

這里帶大家來認識一下對應的參數

在這里插入圖片描述

大致就是這么個用處

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);sleep(5);}

這邊隨便寫一個用用

在這里插入圖片描述

這里可能有人注意到,為什么要sleep(5)

眾所周知,主線程和子線程是同時運行的,創建完子線程,這個主線程就直接結束了
所以說這個int i的變量直接就在主線程中被銷毀了

所以說接下來就引出了線程等待

二.線程等待

1.為什么要線程等待?

首先什么是線程等待?

我們在什么地方看到過等待?

就是我們以前在進程博客中寫過的,進程等待

還記得為什么父子進程要等待嗎
因為你父進程把子進程生了下來,你不能不管啊
如果你父進程結束了,子進程沒有人來回收,那就變成孤兒進程和僵尸進程

映射到我們線程,其實原理也差不多
但是還是有一點不一樣的。
進程是獨立的,但是線程是進程的執行流
當主線程結束后(也就是main函數結束),所有的子進程也會中斷
那為什么要等待呢?
1.資源回收
線程退出時,其棧內存和系統資源不會自動釋放,需要等待來正確釋放

2.同步執行順序:
確保某些操作在其他線程完成后執行

3.獲取返回值:
就是進程執行的結果

所以說我們要介紹一個線程等待的接口
可以接受線程執行結果的返回值,而且是阻塞等待

2.pthread_join()

在這里插入圖片描述
在這里插入圖片描述
接口大致就是這樣的思路

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);pthread_join(lwp_id,nullptr);
}

在這里插入圖片描述

這里我們把sleep,直接換成了 pthread_join(lwp_id,nullptr);
因為是阻塞等待,只會等待子線程處理完,才會結束,所以i的生命周期還在,沒有被銷毀

在這里插入圖片描述
這里其實一直有個編譯警告,這里沒有放出來

意思就是子線程沒有返回值
這里就帶大家把這個等待線程的接受子線程返回值給用用

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;return (void*)(intptr_t)1;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);void* ret;pthread_join(lwp_id,&ret);std::cout<<"running end= "<<(intptr_t)ret<<std::endl;
}

在這里插入圖片描述
這個intptr_t是C++庫中的一個整數類型,它專門用于安全地存儲指針值
intptr_t 是一個有符號整數類型,其大小能夠容納任何有效的指針值

子線程執行結果是通過void*來返回的
所以說我們在子進程中返回void*

然后在pthread_join中接受的返回值是void()**

二級指針就是接受一級指針的地址的所以用取地址

這里要注意一點:
為什么在pthread_join中不考慮異常,只考慮返回值

因為線程出現異常問題,整個線程都完了,所以只有進程才會去考慮異常

三.線程中止

這個其實就是如何返回進程的返回值的

1.return

這個我們在上面的代碼中使用過了,接下來就隨便用用下一個

2.pthread_exit

在這里插入圖片描述
這個其實就當return用就行

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;pthread_exit((void*)(intptr_t)1);
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);void* ret;pthread_join(lwp_id,&ret);std::cout<<"running end= "<<(intptr_t)ret<<std::endl;
}

在這里插入圖片描述

五.線程應用

C++自帶多線程

c++11也已經支持多線程


#include<iostream>
#include<thread>void run_code()
{std::cout<<"i am ok"<<std::endl;}int main()
{std::thread t(run_code);t.join();return 0;}

在這里插入圖片描述

但其實在Linux中的C++的多線程也是封裝的,底層用的還是pthread的原生線程庫
因為你編譯的時候,還是需要-lpthread鏈接原生線程庫
在這里插入圖片描述

不管是什么語言,底層都是調用的原生線程庫,進行封裝的
推薦使用語言自帶的,因為具有可移植性

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

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

相關文章

小程序被爬蟲攻擊,使用waf能防護嗎?

在移動互聯網時代&#xff0c;小程序以輕量化、高便捷性成為流量入口新寵&#xff0c;但也因此成為爬蟲攻擊的重災區。從電商平臺的價格數據爬取到內容平臺的版權盜用&#xff0c;爬蟲攻擊不僅消耗服務器資源&#xff0c;更可能導致商業機密泄露與用戶權益受損。面對這類威脅&a…

通過自動化本地計算磁盤與塊存儲卷加密保護數據安全

作為打造開發者首選云平臺使命的一部分&#xff0c;我們持續推出免費的智能化功能與產品來加強云資源安全。最新推出的本地磁盤加密功能是我們正在所有核心計算區域逐步部署的最新計算特性。當您在首選區域啟用本地磁盤加密功能后&#xff0c;新部署的計算實例將默認自動啟用數…

中文房間悖論:人工智能理解力的哲學拷問

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01;1 思想實驗闡述中文房間&#xff08;Chinese Room&#xff09;思想實驗…

mac如何運行windows程序?性能黨vs便捷黨選擇指南

macOS的流暢穩定雖讓人青睞&#xff0c;但系統的不兼容性是個大問題。有的用戶想要使用某個專業程序&#xff0c;發現只有Windows版本&#xff0c;然而沒法直接在mac上運行&#xff0c;非常懊惱&#xff01;mac如何運行windows程序&#xff1f;本文將提供多個可行的方法&#x…

設置電機數據(閉環驅動器C5-E) ——易格斯igus

4.3 設置電機數據 在調試之前&#xff0c;電機控制器需要電機數據表中的一些值。 ■ 極對數&#xff1a;對象 2030h&#xff1a;00h&#xff08;極對數&#xff09; 電機極對數應在此處輸入。對于步進電機&#xff0c;極對數使用步距角計算&#xff0c;例如&#xff0c;1.8 …

藥品追溯碼(溯源碼)采集系統(二):門診發藥后端

門診發退藥追溯碼采集系統解析&#xff1a;一、門診發退藥追溯碼數據表1.1、Wm_ware_dispense_bill表&#xff1a;該表用于存儲處方信息1.2 Wm_ware_dispense_tracecode:追溯碼采集表二、發退藥后端代碼后端代碼基于Springboot架構和mybatis-plus&#xff0c;先看主要接口信息&…

Unity編輯器相關

前言繼承EditorWindow。 GUILayout類與EditorGUILayout類的應用區別&#xff1a;//TODO創建窗口的方法1&#xff09;GetWindow<T>() 已開則聚焦、未開則創建。無需再手動調用 Show()。GetWindow<T>() 提供多個重載。2&#xff09;CreateInstance<T>()始終創建…

ES支持哪些數據類型,和MySQL之間的映射關系是怎么樣的?

Elasticsearch&#xff08;簡稱 ES&#xff09;是一個分布式搜索和分析引擎&#xff0c;支持豐富的數據類型來適應不同場景。MySQL 是一個關系型數據庫&#xff0c;兩者在數據類型上存在差異&#xff0c;但可以通過映射實現數據同步或集成。下面我將逐步解釋 ES 支持的數據類型…

8.21IPSEC安全基礎后篇,IKE工作過程

一、數據存儲完整性校驗數據存儲完整性校驗需通過加密密鑰實現。數據存儲前還需通過身份認證&#xff0c;該過程同樣依賴密鑰完成。二、對稱key的產生、傳遞、管理VPN中需使用多組對稱密鑰&#xff1a;數據加解密需獨立密鑰數據完整性校驗需獨立密鑰身份認證需獨立密鑰不同功能…

網絡連接的核心機制

一、網絡連接全流程拆解&#xff08;含7大步驟動態交互&#xff09; 1. 用戶輸入網址&#xff1a;從域名到IP的跨越 操作觸發&#xff1a;用戶在瀏覽器輸入 www.example.com&#xff0c;觸發 DNS域名解析。核心協議&#xff1a;DNS&#xff08;基于UDP/TCP&#xff09;。硬件設…

小程序個人信息安全檢測技術:從監管視角看加密與傳輸合規

1. 前言 在監管通報中&#xff0c;小程序因“未采取加密、去標識化等安全技術措施”被處罰的案例屢見不鮮。很多開發者疑惑&#xff1a;明明用了HTTPS&#xff0c;為什么還會被判定“未加密”&#xff1f;監管機構是如何通過技術手段發現這些問題的&#xff1f;本文將從技術原…

ansible playbook 實戰案例roles | 實現db2自動安裝

文章目錄一、核心功能描述二、roles內容2.1 文件結構2.2 主配置文件2.3 tasks文件內容三、files文件內容四、vars文件內容免費個人運維知識庫&#xff0c;歡迎您的訂閱&#xff1a;literator_ray.flowus.cn 一、核心功能描述 這個 Ansible Role 的核心功能是&#xff1a;?自動…

webrtc中win端音頻---windows Core Audio

一、Core Audio 系統內核框架 圖中顯示的是渲染的音頻數據如何從大多數應用程序流向揚聲器的簡化表示。對于采集來說,音頻數據的路徑是完全相同,但流向是相反的。從圖中可以看到,一些高階API(例如MME,DirectSound等),對 Core Audio APIs 進行了封裝,使用這些API能夠更容…

【數據可視化-96】使用 Pyecharts 繪制主題河流圖(ThemeRiver):步驟與數據組織形式

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【Android】Activity 如何進行數據傳輸

三三要成為安卓糕手 一&#xff1a;Activity之間的數據傳輸 問題&#xff1a;不同的Activity之間怎么進行數據傳輸呢? 比如第一個頁面中有一些字符串數據之類的要通過數據傳輸&#xff0c;傳遞給第二個頁面進行顯示的 1&#xff1a;MainActivity做處理 在定義一個按鈕&#xf…

C#語言的語法(數據類型)

數據類型 表2.1給出了C#的主要數據類型。注意&#xff0c;基本類型的長度與計算機或操作系統的類型無關。C# 中的字符是16位的寬度&#xff0c;可以表示非拉丁語言中的所有字符。它使用一種叫雙字節碼的字符編碼 系統&#xff0c;其中定義了絕大多數可書寫語言的數以千計的字符…

Vue3 + TypeScript全局阻止非輸入區域的Backspace鍵,防止回退頁面

main.ts/*** 應用程序主入口** 初始化 Vue 應用并掛載到 DOM*/ import "./assets/style/main.scss";import { createApp } from "vue"; // 全局引入element-plus&#xff0c;對打包后的文件大小不是很在乎&#xff0c;那么使用全局導入會更方便 import Ele…

01數據結構-堆排序

01數據結構-堆排序前言1.堆2.堆的操作邏輯3.堆的代碼實現前言 數據結構中的堆是一種結構&#xff0c;C語言的堆是空間管理的程序員malloc&#xff0c;free的空間&#xff0c;兩者沒多大關系。 1.堆 邏輯上 堆&#xff08;Heap&#xff09;是一類基于完全二叉樹的特殊數據結構…

在線課程|基于SprinBoot+vue的在線課程管理系統(源碼+數據庫+文檔)

在線課程 目錄 基于SprinBootvue的在線課程管理系統 一、前言 二、系統設計 三、系統功能設計 1 管理員模塊的實現 2在線課程 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff1a;??大廠碼農|…

Python海象運算符:=

文章目錄簡介??條件判斷優化循環控制簡化?推導式高效計算?正則匹配與數據提取?性能對比參考文獻簡介 海象運算符 :&#xff0c;又稱??賦值表達式??&#xff08;Assignment Expression&#xff09;&#xff0c;Python 3.8 后可用&#xff0c;PEP 572 引入&#xff0c;…