Linux系統編程 day10 接著線程(中期頭大,還要寫論文)

線程有點懵逼

線程之前函數回顧以及總結部分(對不清楚的問題再思考)

線程控制原語                進程控制原語
pthread_create();          fork();
pthread_self();            getpid();
pthread_exit();            exit();
pthread_join();            wait()/waitpid();
pthread_cancel();          kill();
pthread_detach();

這里寫一下昨天的join函數,那塊有點難理解。

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>struct thrd{int var ; char str[256];
};void* func(void * arg)
{struct thrd *th; // 這里不能直接使用結構體,因為這是在棧上的th = malloc(sizeof(struct thrd)); // 這邊需要在堆區分配內存,如果不使用堆區會發生錯誤,因為當線程執行完之后,棧上的內存會釋放,如果返回棧上的內容會非法訪問。th->val = 200;strcpy(th->str , "hello pthread_join");return (void*)th;
}int main(int argc , char* argv[])
{pthread_t tid ; struct thrd *retval;int ret = pthread_create(&tid , NULL , func , NULL);if(ret != 0){fprintf(stderr , "pthread_create error : %s\n" , strerror(ret)); exit(1);   }ret = pthread_join(tid , (void**)&retval);if(ret != 0){fprintf(stderr , "pthread_join error : %s\n" , strerror(ret)); exit(1);   }printf("child thread exit with var = %d , str = %s\n " , retval->val , retval->str);pthread_exit(NULL);}

線程當中用perror沒有用,線程會直接返回errno,所以在線程中錯誤一般使用下面這個格式:

if(ret != 0){fprintf(stderr , "pthread_create error : %s\n" , strerror(ret)); exit(1);   
}

線程分離之后,子線程結束會自動回收,自動清理PCB,無需回收

ret = pthread_detach(tid)

線程屬性

初始化線程屬性

int pthread_attr_init(pthread_attr_t* attr);
成功返回0
失敗errnofprintf(stderr , "pthread_xxx error:%s\n" , strerror(ret));

銷毀線程屬性所占用的資源?

int pthread_attr_destroy(pthread_attr_t* attr);
成功返回0
失敗errno
fprintf(strerr , "pthread_attr_destroy error:%s\n" , strerror(ret));

設置線程分離

int pthread_attr_setdetachstate(pthread_attr_t* attr , int detachstate);參數:attr:已初始化的線程屬性
detachstate : PTHREAD_CREATE_DETACHED(分離線程)PTHRED_CREATE_JOINABLE(非分離線程)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>void* tfn(void* arg){printf("thread:pid = %d , tid = %lu\n" , getpid() , pthread_self());return NULL;
}int main(int argc , char *argv[])
{pthread_t tid ;//tid = pthread_self();pthread_attr_t attr;int ret = pthread_attr_init(&attr);if(ret != 0){fprintf(stderr , "pthread_attr_init error:%s/n" , strerror(ret));exit(1);}ret = pthread_attr_setdetachstate(&attr , PTHREAD_CREATE_DETACHED);//設置線>程屬性為分離屬性if(ret != 0){fprintf(stderr , "pthread_attr_setdetachstate error:%s/n" , strerror(ret));exit(1);}ret = pthread_create(&tid , &attr , tfn , NULL);if(ret != 0){fprintf(stderr , "pthread_create error:%s/n" , strerror(ret));exit(1);}ret = pthread_attr_destroy(&attr);if(ret != 0){fprintf(stderr , "pthread_attr_destory error:%s/n" , strerror(ret));exit(1);}ret = pthread_join(tid , NULL); // 如何查看是否是分離狀態,不使用那個函數,>函數太長了,可以使用join函數,如果join函數回收失敗出現錯誤,就表示已經為線程分離
。if(ret != 0){fprintf(stderr , "pthread_join error:%s/n" , strerror(ret));exit(1);}printf("main:pid = %d , tid = %lu\n" , getpid() , pthread_self());pthread_exit(NULL);
}

線程使用注意事項

1、主線程退出其他線程不退出,主線程要使用pthread_exit()。

2、避免僵尸線程。

3、malloc和mmap申請的內存可以被其他線程釋放。

4、避免在多線程模型中使用fork,子進程中只有調用fork的線程存在,其余均被退出。

5、信號的復雜語義很難和多線程共存,應避免在多線程引入信號機制。

線程同步

同步:協同,講究先后次序。

協同步調,對公共區域數據按序訪問,防止數據混亂,產生與時間有關的錯誤。

鎖的使用

建議鎖,對公共數據進行保護,所有進程應該在訪問公共數據之前先拿鎖再訪問,但鎖本身不具備強制性。

互斥鎖/互斥量mutex

?使用mutex(互斥量、互斥鎖)一般步驟

1、pthread_mutex_t lock;? ? 創建鎖
2、pthread_mutex_init();    初始化鎖
3、pthread_mutex_lock();    加鎖
4、訪問共享數據
5、pthread_mutex_unlock();  解鎖
6、pthread_mutex_destory(); 銷毀鎖上述函數成功返回0,失敗返回errno

?注意事項:盡量保證鎖的粒度

restrict關鍵字:
用來限定指針變量,被該關鍵字限定的指針變量所指向的內存操作,必須由本指針完成int pthread_mutex_init(pthread_mutex_t *restrict mutex , const pthread_mutexattr_t *restrict attr);

今天沒學完,還要寫論文

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

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

相關文章

《潯川AI翻譯v6.1.0問題已修復公告》

《潯川AI翻譯v6.1.0問題已修復公告》 尊敬的潯川AI翻譯用戶&#xff1a; 感謝您對潯川AI翻譯的支持與反饋&#xff01;我們已針對 **v6.1.0** 版本中用戶反饋的多個問題進行了全面修復&#xff0c;并優化了系統穩定性。以下是本次修復的主要內容&#xff1a; 已修復問題 ?…

深入理解 java synchronized 關鍵字

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…

華三(H3C)與華為(Huawei)設備配置IPsec VPN的詳細說明,涵蓋配置流程、參數設置及常見問題處理

以下是針對華三&#xff08;H3C&#xff09;與華為&#xff08;Huawei&#xff09;設備配置IPsec VPN的詳細說明&#xff0c;涵蓋配置流程、參數設置及常見問題處理&#xff1a; 一、華三&#xff08;H3C&#xff09;設備IPsec VPN配置詳解 1. 配置流程 華三IPsec VPN配置主要…

KBEngine 源代碼分析(一):pyscript 目錄文件介紹

pyscript 目錄文件 pyscript 目錄提供了 KBEngine 把 C++ 代碼中的類注冊到 Python 的機制 同時也提供了 C++ 調用 Python 方法的例子 相對現在的 C++ 17/20 ,這個目錄的分裝相對不優雅 不過不影響學習如何使用 Python 官方庫提供的 API ,實現 C++ Python 混合編程 C++ …

線程入門3

synchronized修飾方法 synchronized可以修飾代碼塊(在線程入門2中有例子)&#xff0c;也可以修飾普通方法和靜態方法。 修飾普通方法 修飾普通方法簡化寫法&#xff1a; 修飾靜態方法 修飾靜態方法簡化寫法&#xff1a; 注意&#xff1a;利用synchronized上鎖&#xff0c;鎖的…

linux上Flexlm命令

FlexLM 是一種靈活的許可證管理系統&#xff0c;廣泛用于各種軟件產品中&#xff0c;如 Autodesk 的 AutoCAD 和 Autodesk 的其他產品。它允許軟件開發商控制軟件的使用和分發&#xff0c;同時提供靈活的許可證管理策略。在 Linux 系統中使用 FlexLM 通常涉及到幾個關鍵步驟&am…

【Java學習方法】終止循環的關鍵字

終止循環的關鍵字 一、break 作用&#xff1a;跳出最近的循環&#xff08;直接結束離break最近的那層循環&#xff09; 使用場景&#xff1a;一般搭配if條件判斷&#xff0c;如果滿足某個條件&#xff0c;就結束循環&#xff0c;&#xff08;場景&#xff1a;常見于暴力枚舉中…

【論文精讀】Reformer:高效Transformer如何突破長序列處理瓶頸?

目錄 一、引言&#xff1a;當Transformer遇到長序列瓶頸二、核心技術解析&#xff1a;從暴力計算到智能優化1. 局部敏感哈希注意力&#xff08;LSH Attention&#xff09;&#xff1a;用“聚類篩選”替代“全量計算”關鍵步驟&#xff1a;數學優化&#xff1a; 2. 可逆殘差網絡…

關于在Springboot中設置時間格式問題

目錄 1-設置全局時間格式1.Date類型的時間2.JDK8時間3.使Date類和JDK8時間類統統格式化時間 2-關于DateTimeFormat注解 1-設置全局時間格式 1.Date類型的時間 對于老項目來說&#xff0c;springboot中許多類使用的是Date類型的時間&#xff0c;沒有用到LocalDateTime等JDK8時…

面試篇:Java并發與多線程

基礎概念 什么是線程&#xff1f;線程和進程的區別是什么&#xff1f; 線程 是程序執行的最小單位&#xff0c;它是 CPU 調度和執行的基本單元。一個進程可以包含多個線程&#xff0c;這些線程共享進程的資源&#xff08;如內存&#xff09;&#xff0c;但每個線程有自己的棧…

【Qt/C++】QPrinter關于QInternal::Printer的解析

1. 問題分析 QInternal::Printer在Qt框架中并不是一個直接暴露給用戶的API。相反&#xff0c;它是一個枚舉值&#xff0c;用于標識QPaintDevice的類型。在Qt中&#xff0c;QPaintDevice是一個抽象類&#xff0c;用于任何可以進行繪制的設備&#xff0c;如窗口、圖像、打印機等…

uniapp返回上一頁接口數據更新了,頁面未更新

注意&#xff1a;不是組件套組件可以不使用setTimeout延時 返回上一頁一般會走onshow&#xff0c;但是接口更新了頁面未更新 onShow(() > {// 切換城市后重新調用數據if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…

MCU開發學習記錄11 - ADC學習與實踐(HAL庫) - 單通道ADC采集、多通道ADC采集、定時器觸發連續ADC采集 - STM32CubeMX

名詞解釋&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文將介紹ADC的概念、相關函數以及STM32CubeMX生成ADC的配置函數。針對于ADC實踐&#xff1a;單通道采集芯片內部溫度傳感器&#xff08;ADC1_ch16&#xff09;&a…

68元撬動未來:明遠智睿2351開發板重塑嵌入式開發生態

在嵌入式開發領域&#xff0c;價格與性能的矛盾始終存在&#xff1a;高端開發板功能強大但成本高昂&#xff0c;低價產品則往往受限于性能與擴展性。明遠智睿2351開發板以68元&#xff08;含稅&#xff09;的定價打破這一僵局&#xff0c;通過四核1.4G處理器、全功能Linux系統與…

關于ubuntu密碼正確但是無法登錄的情況

參考這個文章&#xff1a; https://blog.csdn.net/cuichongxin/article/details/117462494 檢查一下是不是用戶被lock了 輸入passwd -s username 如果用戶是L狀態&#xff0c;那么就是lock了。 使用 passwd -u username 解鎖 關于 .bashrc 不生效 有幾點&#xff1a; ~/.…

LeetCode-47. 全排列 II

1、題目描述&#xff1a; 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&am…

Python 設計模式:訪問者模式

1. 什么是訪問者模式&#xff1f; 訪問者模式是一種行為設計模式&#xff0c;它允許你在不改變對象結構的前提下&#xff0c;定義新的操作。通過將操作封裝在訪問者對象中&#xff0c;訪問者模式使得你可以在不修改元素類的情況下&#xff0c;向元素類添加新的功能。 訪問者模…

基于stm32的智能門鎖系統

標題:基于stm32的智能門鎖系統 內容:1.摘要 摘要&#xff1a;隨著科技的飛速發展&#xff0c;人們對家居安全的要求日益提高&#xff0c;智能門鎖系統應運而生。本研究的目的是設計并實現一個基于STM32的智能門鎖系統。采用STM32微控制器作為核心控制單元&#xff0c;結合指紋…

GitHub 常見高頻問題與解決方案(實用手冊)

目錄 1.Push 提示權限錯誤(Permission denied) 2.push 報錯:rejected non-fast-forward 3.忘記添加 .gitignore,上傳了無關文件 4. 撤銷最近一次 commit 5.clone 太慢或失敗 6.如何切換/創建分支 7.如何合并分支 8.如何刪除遠程分支 9.如何 Fork + PR(Pull Reque…

【MySQL數據庫入門到精通-04 DML操作】

一、DML DML英文全稱是Data Manipulation Language(數據操作語言)&#xff0c;用來對數據庫中表的數據記錄進行增、刪、改操作。 二、添加數據 1.給指定字段添加數據 代碼如下&#xff08;示例&#xff09;&#xff1a; insert into 表名 &#xff08;字段1&#xff0c;字…