linux---線程控制


線程和進程

以前我們要同時跑多個程序,可以通過fork()多個子進程,然后通過系統函數進行程序的替換,但是創建進程代價大,不僅要拷貝一份父進程的地址空間,頁表,文件表述符表等。但是線程不需要因為是進程的執行流,共享同個地址空間,頁表,只需讓不同線程執行不同的代碼塊(函數就可以了)。

一、線程函數接口

它們的返回值都比較統一,成功就返回0,失敗就返回錯誤碼

(1)線程創建

第一個參數類型是我們在定義的一個pthread_t類型的變量指針,通過它我們可以拿到?用戶識別的線程id。第二個參數設置為空。第三個參數是函數指針,第四個是我們要傳入線程執行函數的參數,由于它的類型是void*,我們可以傳入任意類型

(2)線程等待?

線程和進程一樣,雖然是一個進程的地址空間的執行流,但是也要進行等待回收,不然會造成類似內存泄漏 問題。retval是輸出型參數,通過它可以拿到線程退出信息(簡單說就是線程執行函數的返回值)。

(3)線程中止

?進程有退出碼,線程沒有,只有我們自己寫的返回值,既用pthread_exit()返回,或者直接return返回自定義的碼(由于返回值類型是void*,要強轉),不建議用exit()因為會造成主線程退出,主線程退出了,進程資源就釋放了,所有線程就跟著退出了。通常這返回值信息會被線程等待函數pthread_join()拿到。


(4)線程分離?

?以前子進程退出如果父進程不進行等待,我們可以自定義捕捉函數對子進程發出的退出信號進行忽略,不會有僵尸進程。線程也可以通過分離,讓主線程不用主動對它進行等待,就算線程退出也不會有類型內存泄漏問題。注意的是,線程分離只是一種工作狀態,它和沒分離的線程幾乎一樣,只是不用等待了。

二,多線程的創建

pthread_create函數參數由于是void*,我們就可以傳任意類型的對象

makefile

test:classpthreads.ccg++ -o  $@ $^ -std=c++11 -lpthread 
.PHONY:clean
clean:rm -f test

?classpthreads.cc

#include<iostream>
using namespace std;
#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include <sys/types.h>
#include<vector>namespace ljh{
class Task{
public:
Task():datex(0),datey(0)
{}
void SetDate(int x,int y)
{datex=x;datey=y;
}
int Excute()
{return datex+datey;
}
~Task()
{}private:int datex;int datey;};
class threaddate:public Task
{
public:threaddate(int x,int y,char* threadname ):_x(x),_y(y),_threadname(threadname){s.SetDate(_x,_y);}string getname(){return _threadname;}int run(){s.Excute();}private:
string _threadname;
int _x;
int _y;
Task s;};
class Result{
public:
void SetResult(int result,string& threadname)
{_result=result;_threadname=threadname;}
void Print()
{cout<<"result:"<<_result<<"threadname"<<_threadname<<endl;}
private:int _result;string _threadname;
};}using namespace ljh;
void* handlerTask(void*p)
{threaddate* td=static_cast<threaddate*>(p);
string name=td->getname();
Result* result=new Result();
int ret=td->run();
result->SetResult(ret,name);
delete td;
sleep(2);
return result;}vector<Result*>  ret;
vector<pthread_t> pthreadname;
int main()
{for(int i=0;i<5;i++)//創建5個線程{char* name=new char[64];pthread_t id;snprintf(name,sizeof(name),"Thread_%d",i+1);threaddate* p=new threaddate(2,6,name);pthread_create(&id,nullptr,handlerTask,p);pthreadname.push_back(id);}for(auto e:pthreadname){  void* s=nullptr;//返回值,void*pthread_join(e,&s);//線程等待回收ret.push_back((Result*)s);}return 0;
}

三.創建的線程和主線程之間關系

1.多線程只是主線程的執行流,主線程main退出,子進程也會退出,所以我們必須讓主線程最后退出

2.創建的新線程和主線程,哪個先運行,這個取決與調度器。

線程共享和私有

(1)共享:代碼和全局數據和進程文件描述符表

因為它們擁有同一塊地址空間

(2)私有:線程的硬件上下文數據(cpu寄存器的值),線程的獨立棧結構。對于多進程來說,線程的上下文數據比進程少,所以也叫線程為輕量級進程。

我們可以用命令查看(ps -aL | grep? xxx).對于棧來說,不同線程可以分為進程地址空間的棧空間還有線程獨立的棧,訪問全局數據就時訪問進程地址空間主棧,在線程執行函數里面變量之類的就是線程獨立的棧。

驗證:創建3個線程,定義一個全局變量vale,還有線程執行函數的n,不同的線程打印全局vale地址是相同,n的地址卻是不同的。

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

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

相關文章

搜索引擎新特性與未來展望

多元化大模型支持: 本搜索引擎具備卓越的兼容性和靈活性,支持多種大模型(LLMs)。無論是本地部署的llama3、gemma、mistral等模型,還是云服務提供的OpenAI/gpt4-o、Groq/Llama3等,都能輕松接入,為用戶提供豐富的智能搜索體驗。現代化技術棧構建: 項目采用業界領先的Next…

windows docker desktop 更換鏡像存儲目錄

windows docker desktop 更換鏡像存儲目錄 方法&#xff1a;如圖&#xff0c;Browse瀏覽一個新的目錄并選中&#xff0c;確定后&#xff0c;程序會開始stop&#xff0c;在stop完成前&#xff0c;會持續遷移原有鏡像到新的位置&#xff0c;你會發現目標位置的磁盤占用空間越來越…

Mac網線連接windows本【局域網互傳文件】

Mac網線連接windows本【局域網互傳文件】 兩臺電腦網線互聯 Mac->網絡->USP TCP/IP 手動配置IP&#xff0c;子網掩碼&#xff0c;路由器 windows 網絡和Internet配置->更改適配器選項->以太網->Internet協議版本4&#xff08;TCP/IPv4&#xff09;->屬性 …

K8S/ hpa分享

在 Kubernetes 中&#xff0c;HorizontalPodAutoscaler 自動更新工作負載資源 &#xff08;例如 Deployment 或者 StatefulSet&#xff09;&#xff0c; 目的是自動擴縮工作負載以滿足需求。 hpa的使用本身還是很簡單的 示例如下&#xff1a; 官網示例 apiVersion: apps/v1 k…

NetCore發布的時候怎么去除生成的多余的語言文件夾cs,de...,Microsoft.CodeAnalysis語言資源文件

1、問題&#xff1a; .NetCore 3.1 發布出來的publish目錄一大堆雜七雜八的文件夾如下圖&#xff1a; 2、產生原因 由Microsoft.VisualStudio.Web.CodeGeneration.Design包導致 3、解決方法&#xff1a; 如果確實需要某種語言資源文件&#xff0c;可以這樣&#xff0c;右鍵編…

壓擺率SR、增益帶寬積GBP、開環增益Aol

運放的選型對運放電路的實際效果非常關鍵&#xff0c;一定要理解運放重要參數的概念。下面幾天將對運放的選型進行系統學習并做實驗 運放的壓擺率&#xff08;Slew Rate&#xff0c;簡稱SR&#xff09;是指閉環放大器在輸入為階躍信號時&#xff0c;輸出電壓時間變化率的平均值…

vue打包部署到springboot,通過tomcat運行

tomcat默認端口 8080springboot端口 9132vue 端口 9131 框架 項目是基于SpringBootVue前后端分離的倉庫管理系統 后端&#xff1a;SpringBoot MybatisPlus前端&#xff1a;Node.js Vue element-ui數據庫&#xff1a;mysql 一. 打包Vue項目 cmd中輸入命令 npm run build 后…

深度學習之基于YoloV5-Deepsort人物識別與追蹤項目

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與目標 本項目旨在利用深度學習技術&#xff0c;結合YoloV5和Deepsort算法&#xff0c;開發一個高效、…

前端:音頻可視化(H5+js版本)

一、效果展示 HTML5JS實現一個簡單的音頻可視化 二、代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>音頻可視化</title><style></style></head><body><divs…

非平穩信號的傅里葉變換與短時傅里葉變換

一、仿真一個非平穩的時間序列。 N 10000; t 0:N-1; z1 4.2*sin(2*pi/20.*t5); z2 2.2*sin(2*pi/100.*(10.001*t).*t8); w1 randn(length(t),1); yz1z2w1; figure;plot(y,LineWidth,1.5);grid on; ylabel(Signal); xlabel(Time); 二、傅里葉變換&#xff08;FFT&#xff…

教育智能化的歷史及發展趨勢

1. 教育智能化概述 1.1 定義與背景 教育智能化是指利用人工智能、大數據、云計算等現代信息技術&#xff0c;對教育過程進行智能化改造&#xff0c;提升教育質量與效率。隨著技術進步&#xff0c;教育智能化已成為全球教育改革的重要趨勢。 教育智能化的背景可以追溯到20世紀…

Llama 3超級課堂作業筆記

文章目錄 基礎作業完成 Llama 3 Web Demo 部署環境配置下載模型Web Demo 部署對話截圖 使用 XTuner 完成小助手認知微調Web Demo 部署自我認知訓練數據集準備訓練模型推理驗證 使用 LMDeploy 成功部署 Llama 3 模型環境&#xff0c;模型準備LMDeploy CLI chatLMDeploy模型量化(…

SQL Server 2022安裝+SQL Server最新補丁+smss工具連接超詳細教程

文章目錄 一、SQL Server 2022安裝二、SSMS的安裝與連接三、最新補丁下載總結 一、SQL Server 2022安裝 官網下載安裝包&#xff1a;https://www.microsoft.com/en-us/sql-server/sql-server-downloads 打開 選擇自定義 更改你要安裝到的位置后進行安裝 安裝程序包下載完后會自…

將本地項目代碼上傳到別人GitHub的遠程分支上流程記錄

首先將別人的項目克隆到本地&#xff1a; git clone 項目地址 然后cd進項目中&#xff0c;查看分支名稱&#xff1a; git branch git branch -a 切換分支&#xff1a; git checkout 遠程分支名 &#xff08;必須與所要提交代碼的遠程分支同名&#xff09; 截圖案例&#xff1…

簡單的TCP網絡程序:英譯漢服務器

一、服務器的初始化 下面介紹程序中用到的socket API,這些函數都在sys/socket.h中。 1.創建套接字 socket()&#xff1a; ?參數介紹&#xff1a; socket()打開一個網絡通訊端口,如果成功的話,就像open()一樣返回一個文件描述符;應用程序可以像讀寫文件一樣用read/write在網…

AI大模型日報#0523:中國大模型價格戰的真相、大模型「上車」、王小川首款 AI 應用

導讀&#xff1a;AI大模型日報&#xff0c;爬蟲LLM自動生成&#xff0c;一文覽盡每日AI大模型要點資訊&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一萬物”&#xff08;Yi-Large&#xff09;生成了今日要點以及每條資訊的摘要。歡迎閱讀&#xf…

04. Redis 配置文件

文章目錄 單位包含網絡 NETWORK通用 GENERAL快照 SNAPSHOTTING主從復制 REPLICATION安全 SECURITY客戶端 CLIENTS內存設置 MEMORY MANAGEMENTAPPEND ONLY MODE 模式&#xff08;aof 的配置&#xff09; 單位 配置文件對大小寫不敏感&#xff08;unit單位&#xff09;。 包含 …

Flutter 中的 WillPopScope 小部件:全面指南

Flutter 中的 WillPopScope 小部件&#xff1a;全面指南 在 Flutter 應用開發中&#xff0c;WillPopScope 是一個非常有用的小部件&#xff0c;它允許開發者攔截和處理用戶嘗試退出當前頁面的操作。這在需要確認用戶是否真的想要離開當前頁面&#xff0c;或者在離開前需要執行…

京東h5st加密參數分析與批量商品價格爬取(文末含純算法)

文章目錄 1. 寫在前面2. 接口分析3. 加密分析4. 算法還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作! 【??作者推…

羅德與施瓦茨ZNB20矢量網絡分析儀怎么讀取Trace?

矢量網絡分析儀(VNA)是電子測量領域廣泛應用的重要儀器&#xff0c;可以幫助工程師精確測量各種射頻和微波設備的參數&#xff0c;為設計優化、故障診斷等提供關鍵數據支持。作為業界領先的VNA制造商&#xff0c;羅德與施瓦茨的ZNB20型號在測量精度、動態范圍、掃描速度等方面都…