嵌入式自學第三十天(5.28)

(1)多線程資源競爭問題:

互斥:在多線程中對臨界資源的排他性訪問。

解決方案:互斥鎖
mutex互斥鎖在進程pcb塊,ret 為0說明別人在用,1說明空閑。

阻塞鎖
man pthread_mutex_init
man pthread_mutex_destory
定義:pthread_mutex_t ?mutex;內核對象
初始化:man pthread_mutex_init
加鎖 ?pthread_mutex_lock
解鎖 pthread_mutex_unlock
銷毀pthread_mutex_destroy

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

 

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

int WIN = 3;

pthread_mutex_t mutex;

void* th(void* arg)

{

while (1)

{

pthread_mutex_lock(&mutex);

if (WIN > 0)

{

WIN--;

printf("get win\n");

pthread_mutex_unlock(&mutex);

int n = rand() % 5 + 1;

sleep(n);

pthread_mutex_lock(&mutex);

WIN++;

printf("relese win\n");

pthread_mutex_unlock(&mutex);

break;

}

else

{

pthread_mutex_unlock(&mutex);

}

}

return NULL;

}

int main(int argc, char** argv)

{

pthread_t tid[10] = {0};

int i = 0;

pthread_mutex_init(&mutex,NULL);

for (i = 0; i < 10; i++)

{

pthread_create(&tid[i], NULL, th, NULL);

}

for (i = 0; i < 10; i++)

{

pthread_join(tid[i], NULL);

}

pthread_mutex_destroy(&mutex);

system("pause");

return 0;

}

為了并發要保證鎖定內容盡量少,可以快速完成,只鎖全局變量。沒有解鎖就會陷入死鎖。

加鎖后的代碼到解鎖部分屬于原子操作
?

(2)同步:有一定順序的對資源的排他性訪問(二值)

互斥鎖可以控制排他訪問,但沒有順序。

信號量:1/0 ? semaphore.h ?posix


定義:sem_t sem
初始化:int sem_init(,0線程用1進程用,1);,0,0
p申請sem_wait; ? ? ? ? ? ?p申請信號量會阻塞-1
v釋放sem_post ? ? ? ? ?v釋放信號量不阻塞+1 ? ?二值信號量
銷毀sem_destroy

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

 

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <semaphore.h>

sem_t sem_H,sem_W;

void* th1(void* arg)

{

int i =10;

while(i--)

{

sem_wait(&sem_H); // P 操作 也即是 申請信號量 會阻塞 -1

printf("hello ");

fflush(stdout);

sem_post(&sem_W); // V 操作 釋放信號量 +1

}

return NULL;

}

void* th2(void* arg)

{

int i =10;

while(i--)

{

sem_wait(&sem_W);

printf("world\n");

sem_post(&sem_H);

sleep(1);

}

return NULL;

}

int main(int argc, char **argv)

{

pthread_t tid1,tid2;

sem_init(&sem_H,0,1);

sem_init(&sem_W,0,0);

pthread_create(&tid1,NULL,th1,NULL);

pthread_create(&tid2,NULL,th2,NULL);

pthread_join(tid1,NULL);

pthread_join(tid2,NULL);

sem_destroy(&sem_H);

sem_destroy(&sem_W);

system("pause");

return 0;

}

計數信號量是互斥
?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

 

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <semaphore.h>

sem_t sem_WIN;

void* th(void* arg)

{

sem_wait(&sem_WIN);

printf("get win\n");

int n = rand() % 5 + 1;

sleep(n);

printf("relese win\n");

sem_post(&sem_WIN);

return NULL;

}

int main(int argc, char** argv)

{

pthread_t tid[10] = {0};

int i = 0;

sem_init(&sem_WIN,0,3);

for (i = 0; i < 10; i++)

{

pthread_create(&tid[i], NULL, th, NULL);

}

for (i = 0; i < 10; i++)

{

pthread_join(tid[i], NULL);

}

sem_destroy(&sem_WIN);

system("pause");

return 0;

}

(3)死鎖產生條件:
互斥條件:一個資源每次只能被一個進程使用
請求與保持條件:一個進程因請求資源而阻塞時,對以獲得的資源保持不放。
不剝奪條件:進程以獲得的資源,未使用完不能強行剝奪。
循環等待條件:若干進線程之間形成頭尾相接的循環等待資源關系。
?

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

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

相關文章

【HW系列】—web常規漏洞(SQL注入與XSS)

SQL注入與XSS攻防解析&#xff08;安全防御指南&#xff09; 一、SQL注入基礎&#xff08;防御視角&#xff09; ??1. 簡介?? SQL注入是一種通過構造非預期SQL語句操縱數據庫的攻擊技術。作為開發者&#xff0c;需重點關注輸入驗證與查詢安全&#xff0c;建立全流量監測…

Accelerate 2025北亞巡展正式啟航!AI智御全球·引領安全新時代

近日&#xff0c;網絡安全行業年度盛會Accelerate 2025北亞巡展正式在深圳啟航&#xff01;智庫專家、產業領袖及Fortinet高管、產品技術團隊和300余位行業客戶齊聚一堂&#xff0c;圍繞“AI智御全球引領安全新時代”主題&#xff0c;共同探討AI時代網絡安全新范式。大會聚焦三…

RAG系統構建之嵌入模型性能優化完整指南

導讀&#xff1a;在企業級RAG系統的實際部署中&#xff0c;您是否遇到過這樣的困擾&#xff1a;嵌入計算成本不斷攀升&#xff0c;API調用頻繁觸及限制&#xff0c;而系統響應速度卻始終達不到用戶期望&#xff1f;這些看似分散的問題&#xff0c;實際上都指向同一個技術核心&a…

python 自動生成不同行高的word

python 自動生成不同行高的word # -*- coding: utf-8 -*- from docx import Document from docx.shared import Cm, Pt, Inches from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.enum.text import WD_ALIGN_PARAGRAPHclass DynamicTableGenerator:d…

如何訓練意志力

設定清晰的目標 目標需要是具體的&#xff0c;可實現的&#xff0c;有時間限制的。比如不要說“我要鍛煉”&#xff0c;而是改成“每周跑步3次&#xff0c;每次30分鐘”。 從小事開始 起步通常都是困難的&#xff0c;一開始定一個很大很復雜的任務也超出了自己的能力&#x…

FastAPI 依賴注入

依賴注入常用于以下場景&#xff1a; 共享業務邏輯&#xff08;復用相同的代碼邏輯&#xff09; 共享數據庫連接 實現安全、驗證、角色權限 等…… 上述場景均可以使用依賴注入&#xff0c;將代碼重復最小化。 創建依賴項 依賴項就是一個函數&#xff0c;且可以使用與路…

接口冪等性原理與方案總結

文章目錄 接口冪等概念典型場景核心解決方案一鎖二判三更新 方案選型對比 接口冪等概念 定義&#xff1a;無論調用接口多少次&#xff0c;對系統的影響與單次調用一樣 范疇&#xff1a;在后端開發中&#xff0c;通常更關注寫接口的冪等&#xff0c;因為寫接口才會對系統數據造…

【已解決】windows gitbash 出現CondaError: Run ‘conda init‘ before ‘conda activate‘

在 Git Bash 中執行&#xff1a; source /c/Users/你的用戶名/miniconda3/etc/profile.d/conda.sh # 注意填入你自己的路徑 conda init bash關閉并重新打開 Git Bash 終端。測試激活環境&#xff1a; conda activate your_env_name注意事項 要把上述命令中的 你的用戶名 替…

軟件包管理系統的架構與生態機制

文章目錄 前言一、總結二、如何上傳自己的軟件包 前言 在日常軟件開發中&#xff0c;我們經常使用諸如apt install, pip install, npm install之類的命令&#xff0c;但有一個問題是&#xff0c;這些下載命令是從哪里下載的這些軟件包&#xff0c;以及我們是否能上傳自己的代碼…

Java線程池管理最佳實踐(設計模式)

引言 在多線程編程中&#xff0c;線程池是一種非常重要的資源管理工具。合理使用線程池可以顯著提高系統性能&#xff0c;避免頻繁創建和銷毀線程帶來的開銷。今天&#xff0c;我將為大家深入分析一個實用的ThreadPoolManager實現&#xff0c;它來自com.kingdee.eas.util包&am…

4.8.2 利用Spark SQL計算總分與平均分

在本次實戰中&#xff0c;我們的目標是利用Spark SQL計算學生的總分與平均分。首先&#xff0c;我們準備了包含學生成績的數據文件&#xff0c;并將其上傳至HDFS。接著&#xff0c;通過Spark的交互式編程環境&#xff0c;我們讀取了成績文件并將其轉換為結構化的DataFrame。然后…

HTML 文件路徑完全指南:相對路徑、絕對路徑解析與引用技巧

一、為什么必須學會文件路徑&#xff1f;—— 網頁引用資源的 “地址規則” 在 HTML 中&#xff0c;引用圖片、CSS、JS 等外部文件時&#xff0c;必須通過文件路徑告訴瀏覽器資源的位置。路徑錯誤會導致資源無法加載&#xff08;頁面出現 broken image 圖標或樣式丟失&#xf…

keepalived兩臺設備同時出現VIP問題

目錄 問題背景&#xff1a; 日志分析如下&#xff1a; 原因和解決方案總結&#xff1a; 問題背景&#xff1a; keepalived-master和keepalived-slave同時出現了VIP&#xff0c;出現了非對稱路由和雙主現象 日志分析如下&#xff1a; master能夠接受到來自slave的通告消息…

【開源解析】基于PyQt5+Folium的谷歌地圖應用開發:從入門到實戰

&#x1f310;【開源解析】基于PyQt5Folium的谷歌地圖應用開發&#xff1a;從入門到實戰 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每…

篇章五 數據結構——鏈表(一)

目錄 1.ArrayList的缺陷 2. 鏈表 2.1 鏈表的概念及結構 2.2 鏈表結構 1. 單向或者雙向 2.帶頭或者不帶頭 3.循環或者非循環 2.3 鏈表的實現 1.完整代碼 2.圖解 3.顯示方法 4.鏈表大小 5. 鏈表是否存在 key 值 6.頭插法 7.尾插法 8.中間插入 9.刪除key值節點 10.…

數據庫相關面試

數據庫相關面試 Mysql MySQL中的事務隔離級別及其特點 參考&#xff1a;事務的隔離級別&#xff1a;可重復讀 未提交讀(Read Uncommitted)&#xff1a;允許臟讀&#xff0c;也就是可能讀取到其他會話中未提交事務修改的數據 已提交讀(Read Committed)&#xff1a;只能讀取到…

基于Scrapy的天貓商品數據爬取與分析實戰(含API簽名破解與可視化)

基于Scrapy的天貓商品數據爬取與分析實戰&#xff08;含API簽名破解與可視化&#xff09; 本文以華為Mate 60 Pro為例&#xff0c;詳細介紹如何使用Scrapy框架爬取天貓商品數據&#xff0c;涵蓋API簽名破解、反爬應對、數據存儲及可視化全流程&#xff0c;適合爬蟲進階學習者實…

【C++進階篇】哈希表的模擬實現(賦源碼)

這里寫目錄標題 前言一. 開放地址法實現哈希表1.1 閉散列結構定義1.2 構造函數1.3 插入&#xff08;線性探測&#xff09;1.3.1 傳統寫法1.3.2 現代寫法 1.4 查找1.5 刪除 二. 鏈地址法實現哈希表&#xff08;哈希桶&#xff09;2.1 開散列結構定義2.2 構造函數2.3 插入2.4 查找…

07-后端Web實戰(部門管理)

5. 修改部門 對于任何業務的修改功能來說&#xff0c;一般都會分為兩步進行&#xff1a;查詢回顯、修改數據。 5.1 查詢回顯 5.1.1 需求 當我們點擊 "編輯" 的時候&#xff0c;需要根據ID查詢部門數據&#xff0c;然后用于頁面回顯展示。 5.1.2 接口描述 參照參照…

深度解析項目集方向或目標根本性轉變的應對策略 —— 項目集管理實戰指南

在復雜多變的商業環境中&#xff0c;項目集管理面臨著重重挑戰&#xff0c;而項目集方向或目標的根本性轉變無疑是其中最具沖擊力的問題之一。本文將深度剖析這一難題&#xff0c;為項目集管理從業者提供實用、新穎且富有價值的應對策略&#xff0c;助力大家在項目集管理的復雜…