day30——零基礎學嵌入式之線程2.0

一、進程和線程的對比

線程進程
定義輕量級的進程。是進程中的執行單元,作為CPU調度的基本單位進程時程序的一次執行過程,作為CPU的資源分配的基本單位
優勢
  • 創建以及切換速度塊-----效率高
  • 線程(線程共享了進程的資源)間共享資源方便
創建多個子進程,進程之間空間相互獨立---進程的穩定性、可靠性、安全性高
缺點
  • 線程間容易產生資源競爭------數據操作可能不是預期效果
  • 線程的可靠性、穩定性,不如進程
進程間,共享數據不方便

二、解決線程資源競爭問題 --- 線程互斥

1.名詞解釋

  • 臨界資源----共享資源
  • 臨界區----:一段代碼區域(訪問臨界資源的那段代碼)
  • 原子操作----要么不操作,如果要操作,一定是一次性完成的操作,不可被打斷;
  • 互斥----在多線程中對臨界資源的排他性訪問
  • 互斥機制===》互斥鎖===》保證臨界資源團的訪問控制;

????????為了保證臨界資源(共享資源)的完整操作,增加了鎖的機制,即同時滿足互斥訪問(線程1訪問,線程2不可被訪問),+原子性操作(訪問的整個過程必須完整,不可被打斷)。

2.框架:

定義互斥鎖 ===》 齒梳化鎖 ===》 加鎖 ===》 解鎖 ===》 銷毀

????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ?????

3.函數

pthread_mutex_t? ?+鎖命名? ? ? ? ? ? ? 【在全局變量中定義】

pthread_mutex_t? ?+鎖命名 +PTHREAD_MUTEX_INITIALIZER? ? ? ? ? ? ? ? 【靜態初始化】

pthread_mutex_init();? ? ? ? ? ? ? ? ? ? ? ? 【在mian函數定義】【動態初始化】

(1)功能:將已經定義好的互斥鎖初始化

(2)參數:

? ? ? ? mutex:要初始化的互斥鎖

? ? ? ? atrr:初始化的值,一般默認 NULL;

(3)返回值:

? ? ? ? ? ? ? ? 成功返回0;

? ? ? ? ? ? ? ? 失敗返回非0;

pthread_mutex_lock();? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【加鎖】

(1)用指定的互斥鎖開始加鎖代碼,加鎖后的代碼到解鎖部分代碼屬于原子操作;在加鎖期間其他進程/線程都不可以操作該部分代碼;如果函數在執行的時候,metex以及被其他部分,使用則代碼阻塞;

(2)參數:mutex 用來給代碼枷鎖的互斥鎖

(3)返回值

? ? ? ? ? ? ? ? 成功返回0;

? ? ? ? ? ? ? ? 失敗返回非零;

pthread_mutex_uhlock();? ? ? ? ? ? ? ? ? ? ? ? ?【解鎖】

(1)功能:將指定的互斥鎖解鎖,解鎖之后代碼不在排他訪問,一般枷鎖解鎖成對出現。

(2)參數:用來解鎖的互斥鎖;

(3)返回值:

? ? ? ? ? ? ? ? 成功返回0;

????????????????失敗返回非零

pthread_mutex_d();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【銷毀鎖】

(1)功能:銷毀互斥鎖;

(2)參數:用來銷毀的互斥鎖;

(3)返回值:

? ? ? ? ? ? ? ? 成功返回0;

? ? ? ? ? ? ? ? 失敗返回非零;

代碼示例

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int cnt =0;
pthread_mutex_t mutex;void *cn1(void *arg)
{ for(int i =0;i<500000;++i){pthread_mutex_lock(&mutex);int tmp = cnt;tmp = tmp+1;cnt = tmp;pthread_mutex_unlock(&mutex);printf("%d\n",cnt);}pthread_exit(NULL);return NULL;
}
void *cn2(void *arg)
{for(int i =0;i<500000;++i){pthread_mutex_lock(&mutex);int tmp = cnt;tmp = tmp+1;cnt = tmp;pthread_mutex_unlock(&mutex);printf("%d\n",cnt);} pthread_exit(NULL);return NULL;
}
int	main(int argc, char **argv)
{pthread_t tid1,tid2;pthread_mutex_init(&mutex, NULL);pthread_create(&tid1, NULL, cn1, NULL);pthread_create(&tid2, NULL, cn2,NULL);pthread_join(tid1, NULL);printf("-------------%d\n",cnt);pthread_mutex_destroy(&mutex);pthread_join(tid2, NULL);return 0;
}

總結:

  • 鎖的目的,保證臨界資源的互斥以及原子性訪問

三、線程間協作-----線程同步

  • 互斥 ===》 在多線程中臨界資源的排他性訪問
  • 同步 ===》 有一定先后順序的,對資源的排他性訪問。-------有順序的訪問

1.信號量背景:交通信號燈

(1)信號量的機制:

  • ????????站在a的角度考慮:這塊資源什么時候能用
  • ????????站在b的角度考慮:這塊資源什么時候能用

2.信號量分類

  • 信號無名量 ===》 線程間通信
  • 有名信號量 ===》 進程間通信

3.框架

信號量的定義? ?sem_t? ?sem;
信號量的初始化??sem_init()
信號量的P操作(申請資源)、V操作(釋放資源)?sem_wait()/sem_podt();
信號量的銷毀sem_destroy()

四、線程同步函數

1、semapthore? ?信號量的定義? ?

? ? ?sem_t? ? ? ? ? ? ? ?sem

? 信號量類型? ? 信號量的變量

2、信號量的初始化

? ? ? ?int sem_init(sem_t *sem, int pshared, unsigned int value);

(1)功能:將已經定義好的信號量賦值。

(2)參數:

  • sem:要初始化的信號量
  • pthread? ?=0? :表示線程間使用信號量;

? ? ? ? ? ? ? ? ? ? !=0:表示進程間使用的信號量

  • value:信號量的初始值,一般無名信號量-------代表一類資源的個數;

(3)返回值:

????????????????成功返回0;

? ? ? ? ? ? ? ? 失敗返回-1;

3.P操作、V操作?

P操作------申請資源

(if(是否有資源可用)

???????????????? ? 有;則程序往下使用資源

? ? ? ? ? ? ? ? ? 無;程序阻塞,等待資源可用

V操作 ------ 釋放資源

????????????????if(是否有仍無需要資源)

? ? ? ? ? ? ? ? ? 有:釋放資源給對應的任務用;

? ? ? ? ? ? ? ? ? 無:讓資源個數加一,表示可用的資源數量多了一個,即新產生了一個資源;

int sem_wait(sem_t *sem); 【 P操作】

(1)功能:判斷當前sem信號量是否有資源可用;如果sem有資源(==1),則申請資源。程序繼續云頂;如果sem沒有資源(==0),則線程阻塞等待,一旦有資源,組自動盛情資源并繼續運行;

注意:sem申請資源后回自動執行,sem = sem -1;

(2)參數:sem要判斷信號量的資源

(3)返回值:

? ? ? ? ? ? ? ? ?成功返回0;

? ? ? ? ? ? ? ? 失敗返回-1;

int sem_post(sem_t *sem); 【V操作】

(1)功能 :?函數可以將指定的sem信號量資源釋放,并默認執行,sem = sem+1;?線程在該函數上不會阻塞。

(2)參數:sem要釋放資源的信號量;

(3)返回值

? ? ? ? ? ? ? ? ?成功返回0;

? ? ? ? ? ? ? ? 失敗返回-1;

4.信號量的銷毀

?int sem_destroy(sem_t *sem);

?(1)功能:使用完畢將指定的信號量銷毀
(2)參數:sem要銷毀的信號量
(3)返回值:

? ? ? ? ? ? ? ? ?成功返回0;

? ? ? ? ? ? ? ? ?失敗返回-1;

信號的操作:-----主要用來實現線程間的順序? ? ? ?

示例代碼

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>#include <semaphore.h>
sem_t sem_r;
sem_t sem_w;
char buf[1024] = {0};
void *sh1(void *arg)
{while(1){sem_wait(&sem_w);fgets(buf, sizeof(buf),stdin);sem_post(&sem_r);}
}
void *sh2(void *arg)
{while(1){sem_wait(&sem_r);printf("buf = %s",buf);sem_post(&sem_w);}
}
int	main(int argc, char **argv)
{pthread_t tid1,tid2;sem_init(&sem_w, 0, 1);sem_init(&sem_r, 0, 0);pthread_create(&tid1, NULL, sh1, NULL);pthread_create(&tid2, NULL, sh2, NULL);pthread_join(tid1, NULL);pthread_join(tid1, NULL);return 0;
}

五.應用

1.什么時候用

  • 鎖 ----有多線程,公共資源,互斥訪問
  • 信號量-----多線程,公共資源,順序訪問

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

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

相關文章

洛谷 P1395 會議

【題目鏈接】 洛谷 P1395 會議 【題目考點】 1. 樹形動規&#xff1a;樹的重心 本題為求樹的重心模板題 【解題思路】 樹的重心&#xff1a;相比于樹中其它結點&#xff0c;其所有的子樹中結點數最多的子樹的結點數最少&#xff0c;該結點就是這棵樹的重心。 另一種定義&…

Microsoft 365 Adoption Score功能深度解析:驅動企業數字化轉型的利器

在數字化轉型的浪潮中,Microsoft 365(原Office 365)憑借其強大的生產力工具和云服務生態,已成為全球企業和組織提升效率、協作和創新的核心平臺。然而,僅僅部署Microsoft 365并不足以充分發揮其潛力,關鍵在于如何推動員工高效采用這些工具,并將其融入日常工作流程。為此…

尺寸標注識別5 實例分割 roboflow | result.boxes獲取邊界框 | yolov8n-seg架構 torchinfo | 對直線關系不敏感

https://gitee.com/njsgcs/yolo-local 單標注一個尺寸線 100輪就百分百了 Sign in to Roboflow 有混起來的問題 roboflow訓練用的cocon-seg模型我網上找不到 上面這種比較麻煩 text的中心要在dt范圍內 屏幕點以下等同于按下save&#xff08;enter&#xff09; 取最長線段作…

敏捷開發卡在需求分析?飛算 JavaAI 加速需求確認與功能迭代

在敏捷開發中&#xff0c;需求分析常成為團隊推進的 “卡點”—— 模糊的需求描述、反復的需求變更、拆解落地難等問題&#xff0c;往往導致迭代周期延長。而飛算 JavaAI 作為專為 Java 開發設計的工具&#xff0c;正通過 “需求理解 - 接口設計 - 代碼生成” 的全流程智能化&a…

QT跨平臺應用程序開發框架(10)—— Qt窗口

目錄 一&#xff0c;關于窗口 二&#xff0c;菜單欄 2.1 菜單介紹 2.2 添加菜單 2.3 添加快捷鍵 2.4 添加其子菜單 2.5 添加分割線和圖標 三&#xff0c;工具欄 3.1 添加和使用工具欄 3.2 設置位置屬性 四&#xff0c;狀態欄 五&#xff0c;浮動窗口 六&#xff0c;對話框 6.1 …

git從本地倉庫添加到遠程倉庫

先創建&#xff0c;然后配置 Git 的全局用戶名和郵箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看設置的用戶名和郵箱如何生成SSH公鑰&#xff1f;ssh-keygen 生成sshkeyls ~…

鎖步核,為什么叫鎖步核?

“鎖步核”&#xff08;Lockstep Cores&#xff09;這一名稱源于其工作原理與軍事隊列行進中的“鎖步”&#xff08;Lockstep&#xff09;動作的類比。以下是詳細的說明整理&#xff1a;1. 軍事起源&#xff1a;什么是“鎖步”&#xff1f; 在傳統軍事訓練中&#xff0c;“鎖步…

python學智能算法(二十二)|SVM-點與超平面的距離

引言 前序學習進程中&#xff0c;了解了向量、向量點積運算、超平面、感知機等知識點。 SVM算法最核心的目標是通過規劃租號的分割超平面&#xff0c;來使得超平面附近的點到超平面的距離和達到最大值。 那點和超平面的距離如何計算&#xff0c;就是今天學習的重點。 點與超平…

參會邀請!2025世界人工智能大會合合信息技術交流日報名啟動!

2025世界人工智能大會即將開幕&#xff0c;合合信息邀請您一起參與KOL深度技術交流活動。本次活動不僅可以帶您逛展2025世界人工智能大會&#xff0c;在合合信息展臺體驗AI黑科技&#xff0c;還可以與行業頂尖技術專家面對面交流&#xff0c;共同探討當下熱門AI安全話題。 詳細…

零基礎入門:用C++從零實現TCP Socket網絡小工具

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 網絡編程中的套接字&#xff08;Socket&#xff09;是通信的基本接口&#xff0c;允許不同計算機之間通過網絡交換數據。套接字是計算機網絡中通信的“端點”&#xff0c;通過它&#xff0c;應用程序可以與…

SOES:軟實現EtherCAT從站協議棧項目介紹及從站開發案例

在現代工業自動化領域&#xff0c;EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;以其高速、實時和開放的特性&#xff0c;成為現場總線通信的主流協議之一。EtherCAT網絡中&#xff0c;主站&#xff08;Master&#xff09;負責調度和管理&#…

[simdjson] 填充字符串 | `document` 對象 | on-demand 模式

第二章&#xff1a;填充字符串 在第一章解析器中&#xff0c;我們學習了simdjson::dom::parser和simdjson::ondemand::parser作為可復用內存的JSON解析工具。 本章將深入解析JSON數據輸入的核心要求——“填充字符串”。 為何需要填充&#xff1f; simdjson通過SIMD&#x…

扭蛋機小程序開發:開啟線上娛樂新風尚

在當今數字化浪潮席卷的時代&#xff0c;娛樂方式正經歷著前所未有的變革。傳統的扭蛋機&#xff0c;那充滿驚喜與期待的實體裝置&#xff0c;曾是無數人童年回憶中的歡樂源泉。如今&#xff0c;隨著科技的飛速發展&#xff0c;扭蛋機小程序開發應運而生&#xff0c;將這份經典…

【React Native】布局和 Stack 、Slot

布局和Stack 點擊鏈接后&#xff0c;頁面切換時最好是有動畫效果。頁面一般都有頭部&#xff0c;里面有頁面的標題之類的東西。 在app目錄里&#xff0c;新建一個_layout.js文件&#xff0c;這是項目的布局文件。 這個名字是固定的&#xff0c;前面必須有一個_ 。 布局的意…

3C電子產品藍光三維掃描檢測方案-中科米堆CASAIM

隨著3C電子產品向輕薄化、精密化方向發展&#xff0c;傳統的二維檢測技術已難以滿足現代制造業對產品精度的高標準要求。特別是在智能手機、平板電腦等消費電子領域&#xff0c;微小的結構偏差都可能導致產品組裝困難或性能下降。當前行業內普遍面臨檢測效率低、數據采集不完整…

Docker 鏡像原理

Union FS(聯合文件系統) Union File System 是一種分層、輕量級并且高性能的文件系統&#xff0c;它支持對文件系統的修改作為一次提交來一層層的疊加&#xff0c;同時可以將不同目錄掛載到同一個虛擬文件系統下。UnionFS 是一種為 Linux&#xff0c;FreeBSD 和 NetBSD 操作系統…

為什么IoTDB成為物聯網場景的技術優選?

在物聯網、工業監控等領域&#xff0c;時序數據的高效管理成為技術架構設計的關鍵環節。時序數據庫作為專門處理帶時間戳數據的系統&#xff0c;其選型需兼顧性能、兼容性與場景適配性。本文將從技術角度解析 IoTDB 的設計理念與實踐方法&#xff0c;為時序數據庫選型提供參考。…

js中的微任務和宏任務的理解

在JavaScript中&#xff0c;微任務&#xff08;Microtask&#xff09;和宏任務&#xff08;Macrotask&#xff09;是異步任務執行機制的重要組成部分&#xff0c;它們共同構成了JavaScript事件循環&#xff08;Event Loop&#xff09;的核心邏輯。理解這兩個概念對于編寫高性能…

Spring-AI系列-AI模型-Model

原文-知識庫&#xff0c;歡迎大家評論互動 AI Model API Portable ModelAPI across AI providers for Chat, Text to Image, Audio Transcription, Text to Speech, and Embedding models. Both synchronous and stream API options are supported. Dropping down to access mo…

MySQL查詢今天、昨天、上周、近30天、去年等的數據的方法

目錄 常用的MySQL查詢今天、昨天、上周、近30天、去年等數據的方法 0、Sql server中DateDiff()用法 1、MySQL的DATE_SUB()函數 定義和用法 語法 實例 2、MySQL的TO_DAYS(date) 3、MySQL的DATE() 函數 定義和用法 4、MySQL NOW() 函數 定義和用法 語法 實例 例子 …