學習嵌入式第三十天

文章目錄

  • 進程和線程(續)
    • 線程
      • 1.線程傳參
      • 2.線程屬性
      • 3.線程間通信
        • 1.概念
        • 2.方式
        • 3.互斥鎖
        • 4.死鎖
        • 5.信號量
  • 習題

進程和線程(續)

線程

1.線程傳參

  • 使用第四個參數實現對線程內部的傳參

    代碼實現:

    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <pthread.h>
    #include <unistd.h>typedef struct pthread_arg{pthread_t tid;char threadname[32];int sleeptime;
    }pthread_arg_t;void *thread(void *arg){pthread_arg_t *parg = arg;printf("%s(TID:%#lx)開始執行\n",parg->threadname,parg->tid);while(1){printf("%s正在執行\n",parg->threadname);sleep(parg->sleeptime);}return NULL;
    }int main(void){int i = 0;pthread_arg_t args[4] = {{0,"采集線程", 1},{0, "存儲線程", 2},{0, "顯示線程", 5},{0, "日志線程", 10}};for(i = 0;i < 4;i++){pthread_create(&args[i].tid,NULL,thread,&args[i]);}for(i = 0;i < 4;i++){pthread_join(args[i].tid,NULL);}return 0;
    }
    

2.線程屬性

  • 加入屬性:線程結束需要pthread_join手動回收,但是可以完成線程間同步
  • 分離屬性:線程結束后系統自動回收線程空間
  1. pthread_attr_init

    原型:int pthread_attr_init(pthread_attr_t *attr);
    功能:線程屬性初始化
    參數:attr:線程屬性空間的首地址
    
  2. pthread_attr_setdetachstate

    原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    功能:將線程屬性設置為分離屬性
    參數:attr:線程屬性空間的首地址detachstate:屬性PTHREAD_CREATE_DETACHED	分離屬性PTHREAD_CREATE_JOINABLE	加入屬性
    
  3. pthread_attr_destroy

    原型:int pthread_attr_destroy(pthread_attr_t *attr);
    功能:線程屬性銷毀
    參數:attr:線程屬性空間的首地址
    

3.線程間通信

1.概念
  • 多個線程間傳遞信息
2.方式

采用全局變量

  • 原因:進程是操作系統分配的最小單元;每個進程空間獨立,包含文本段,數據段(全局變量),系統數據段;一個進程中的多個線程獨享棧空間,而文本段,數據段,堆區進程多線程共享
  • 多線程同時操作共享空間會引發資源競爭,需要加上互斥鎖解決資源競爭問題
3.互斥鎖
  1. 概念

    • 解決資源競爭的一種方式,可以看成是一種資源

    • 只能加鎖一次,加鎖期間不能再次加鎖,也不能強制占有一個已經加鎖的鎖資源,必須等待鎖資源釋放,也就是解鎖后才能繼續操作該鎖

    • 加鎖和解鎖中間的代碼稱為臨界代碼,也稱為臨界區

    • 只能防止多個線程對資源的競爭,不能決定代碼的先后執行順序

    • 原子操作:CPU執行原子操作時無法切換調度任務

  2. 使用方式

    • 定義互斥鎖
    • 對鎖初始化
    • 操作全局資源前先加鎖
    • 如果加鎖成功則完成對全局資源操作
    • 如果加鎖失敗則表示有人占用資源,必須等待其余人釋放鎖資源才能加鎖成功
    • 直到加鎖成功使用該全局資源
  3. 函數接口

    1. pthread_mutex_init

      原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
      功能:初始化互斥鎖
      參數:mutex:互斥鎖空間首地址attr:屬性,默認為NULL
      返回值:成功返回0失敗返回-1
      
    2. pthread_mutex_lock

      原型:int pthread_mutex_lock(pthread_mutex_t *mutex);
      功能:互斥鎖加
      
    3. pthread_mutex_unlock

      原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);
      功能:互斥鎖解
      
    4. pthread_mutex_destroy

      原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);
      功能:互斥鎖銷毀
      
4.死鎖
  1. 概念
    • 多線程由于加鎖解鎖不合理導致程序無法繼續向下運行的狀態
  2. 產生的條件
    • 互斥條件
    • 不可剝奪條件
    • 請求保持條件
    • 循環等待條件
  3. 避免死鎖
    • 加鎖順序保持一致
    • 使用pthread_mutex_trylock替換pthread_mutex_lock
5.信號量
  1. 概念

    • 信號量是一種資源
    • 信號量只能完成初始化,銷毀,申請,釋放四種操作
    • 如果信號量資源數為0,申請資源會阻塞等待,直到占用資源的任務釋放資源,資源數不為0時才能申請到資源并繼續向下執行
    • 釋放資源不會阻塞
  2. 函數接口

    1. sem_init

      原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
      功能:初始化信號量
      參數:sem:信號空間首地址pshared:0:一個進程的多個線程間共享!0:多個進程間共享value:初始化的資源的值	
      返回值:成功返回0失敗返回-1
      
    2. sem_destroy

      原型:int sem_destroy(sem_t *sem);
      功能:銷毀信號量
      參數:sem:信號量空間的首地址
      返回值:成功返回0失敗返回-1
      
    3. sem_wait

      原型:int sem_wait(sem_t *sem);
      功能:申請信號量
      參數:sem:信號量空間的首地址
      返回值:成功返回0失敗返回-1
      
      • 申請信號量會使信號量資源數為-1
      • 如果信號量資源數為0,則會阻塞等待,直到有任務釋放資源,才能拿到資源并繼續向下執行
    4. sem_post

      原型:int sem_post(sem_t *sem);
      功能:
      釋放信號量
      參數:
      sem:信號量空間首地址
      返回值:
      成功返回0
      失敗返回-1
      

習題

編寫三個線程任務,線程一循環打印‘A’,線程一循環打印‘B’,線程一循環打印‘C’,要求打印出的字符順序總為ABC

代碼實現:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<semaphore.h>sem_t sem_wa;
sem_t sem_wb;
sem_t sem_wc;void *thread1(void *arg){while(1){sem_wait(&sem_wa);printf("A\n");sem_post(&sem_wb);}return NULL;
}
void *thread2(void *arg){while(1){sem_wait(&sem_wb);printf("B\n");sem_post(&sem_wc);}return NULL;
}
void *thread3(void *arg){while(1){sem_wait(&sem_wc);printf("C\n");sem_post(&sem_wa);}return NULL;
}int main(void){pthread_t tid1;pthread_t tid2;pthread_t tid3;sem_init(&sem_wa,0,1);sem_init(&sem_wb,0,0);sem_init(&sem_wc,0,0);pthread_create(&tid1,NULL,thread1,NULL);pthread_create(&tid2,NULL,thread2,NULL);pthread_create(&tid3,NULL,thread3,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);sem_destroy(&sem_wa);sem_destroy(&sem_wb);sem_destroy(&sem_wc);return 0;
}

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

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

相關文章

GaussDB 數據庫架構師修煉(十三)安全管理(3)-行級訪問控制

1 背景行級訪問控制特性將數據庫的訪問控制精確到數據表行級別 &#xff0c;只允許用戶查看 、更新或刪除特定的行數據。2 實例場景實例以醫生只能看到治療的病人&#xff0c;不能看其它醫生的病人為例&#xff1a;1)醫院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 與蜂窩網絡(手機網絡)的核心區別,以及 Wi-Fi 技術未來的發展方向

在日常生活中&#xff0c;我們既離不開家里的 Wi-Fi&#xff0c;也離不開手機的 4G/5G 網絡。它們都能把我們連接到互聯網&#xff0c;但底層的工作方式卻大不相同。一、設計初衷的不同Wi-Fi誕生于 1997 年的 IEEE 802.11 標準&#xff0c;定位是局域網無線替代。它的目標是讓電…

C++編程實戰:高效解決算法與數據結構問題

個人主頁 &#xff1a; zxctscl 專欄 【C】、 【C語言】、 【Linux】、 【數據結構】、 【算法】 如有轉載請先通知 題目1. 數字統計2. 兩個數組的交集3. 牛牛的快遞4. 點擊消除5. 最小花費爬樓梯6. 簡寫單詞1. 數字統計 BC153 數字統計 #include <iostream> using na…

《零基礎入門AI:深度學習中的視覺處理(卷積神經網絡(CNN)進階)》

一、卷積知識擴展 1. 二維卷積 單通道版本 對于單通道輸入圖像 III (尺寸 HWH \times WHW) 和卷積核 KKK (尺寸 FFF \times FFF)&#xff0c;輸出特征圖 OOO 的計算公式為&#xff1a; O(i,j)∑m0F?1∑n0F?1I(im,jn)?K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可視化圖表-pie:從入門到精通(進階篇)

歡迎來到pyecharts餅圖系列教程的進階篇&#xff01;在上一篇基礎教程中&#xff0c;我們學習了餅圖的基本概念和簡單實現。在本文中&#xff0c;我們將深入探索pyecharts中餅圖的六種高級用法和自定義選項&#xff0c;包括環形餅圖、富文本標簽餅圖、滾動圖例餅圖、環形圖、嵌…

【JAVA 核心編程】面向對象高級:類變量與方法 抽象類與接口

一、類變量與類方法&#xff08;靜態變量&#xff09; 1&#xff09;類變量 class Child{private String name;//定義一個變量count&#xff0c;是一個類變量&#xff08;靜態變量&#xff09;static靜態//該變量最大的特點就是會被Child 類的所有對象訪問public static int co…

【Java基礎面試題】數據類型

Java面試高頻總結&#xff1a;基本數據類型深度解析 &#x1f4ca; 八種基本數據類型詳解數據類型關鍵字字節數位數默認值取值范圍核心特性字節型byte180-128 ~ 127最小整數類型短整型short2160-32,768 ~ 32,767較少使用整型int4320-2 ~ 2-1 (約21億)最常用整數類型長整型long8…

攻防世界—unseping(反序列化)

一.審題<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI熱點周報(8.10~8.16):AI界“冰火兩重天“,GPT-5陷入熱議,DeepSeek R2模型訓練受阻?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄3分鐘速覽版&#xff1a;一張表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在線婚紗攝影網站的設計與實現016023190_源碼LW_講解安裝

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹論文設計框架系統測試核心代碼參考示例總結源碼獲取詳細視頻演示或者查看其他版本&#xff1a;文章底部獲取博主聯系方式&#xff01;前言-本系統介紹 利用Python語言、MySQL數據庫&#xff0c;Django框架&#xff0…

Python爬蟲-爬取政務網站的文檔正文內容和附件數據

前言 本文是該專欄的第67篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以某政務網站為例子。基于Python爬蟲采集某政務網站的文檔正文內容和其關聯的附件數據。 具體的實現思路以及完整實現代碼邏輯,筆者將在正文進行詳細介紹。廢話不多說,跟著筆者直接往下…

Python:如何在Pycharm中顯示geemap地圖?

01 說明 或許在舊版本的python和jupyter中并不能成功. 作為參考&#xff0c;這里給出實驗成功的版本&#xff1a;名稱版本通道geemap0.36.1conda-forgejupyter1.1.1conda-forgepycharm2024.1.4 (Professional Edition)nullpython3.11.13conda-forge此外&#xff0c;由于顯示底圖…

力扣3:無重復字符的最長子串

力扣3:無重復字符的最長子串題目思路代碼題目 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 思路 這道題的思路其實是很簡單的&#xff0c;最后我們需要得到子串的長度所以我們可以定義兩個變量即子串的左邊界和右邊界這樣有了左右邊界就…

Git登錄配置的詳細方法

Git登錄綁定主要涉及配置用戶信息和設置身份驗證。以下是詳細的配置方法&#xff1a; 1. 配置基本用戶信息 # 全局配置用戶名和郵箱 git config --global user.name "你的用戶名" git config --global user.email "你的郵箱example.com"# 或者為單個倉庫配…

測試工程師的AI轉型指南:從工具使用到測試策略重構

測試工程師的AI轉型指南&#xff1a;從工具使用到測試策略重構 測試工程師正站在職業轉型的十字路口。當GitHub Copilot能自動生成測試用例&#xff0c;AI性能工具能預測系統瓶頸&#xff0c;傳統“手動執行用例、人工分析結果”的工作模式正被顛覆。某互聯網公司測試團隊的調研…

3D打印——給開發板做外殼

3D打印——給開發板做外殼前言一、建立開發板3D模型根據開發板尺寸繪制草圖繪制PCB草圖&#xff08;手動&#xff09;繪制PCB草圖&#xff08;導入&#xff09;拉伸PCB板下載零件3D模型裝配零件二、建立外殼3D模型盒子蓋子&#xff08;卡扣&#xff09;最終效果三、問題記錄前言…

Spring AI架構分析

Spring AISpring AI開發框架提供對接應用與AI模型的集成開發能力&#xff0c;讓開發者更加容易地開發智能體以及其他生成式人工智能的應用&#xff1a;模型&#xff08;Model&#xff09;AI模型是算法與數據的集合&#xff0c;用于處理信息以及生成信息&#xff0c;主要AI模型的…

Javar如何用RabbitMQ訂單超時處理

RabbitMQ 訂單超時處理方案 使用 RabbitMQ 的 TTL 死信隊列&#xff08;DLX&#xff09; RabbitMQ 的 TTL&#xff08;Time-To-Live&#xff09; 和 死信隊列&#xff08;Dead Letter Exchange&#xff09; 是處理訂單超時的常見方案。核心思路是設置消息的過期時間&#xff0…

記錄一下 StarRocks 點查的 Profile Metrics

背景 Starrocks 3.5 補充兩個點查的 profile 一個是沒有開啟點查的情況&#xff0c;也就是SET enable_short_circuit false; 一個是開啟點查的情況&#xff0c;也就是SET enable_short_circuit true; 其中建表語句如下&#xff1a; CREATE TABLE ac_account (id bigint(20) …

react echarts圖表監聽窗口變化window.addEventListener(‘resize’)與ResizeObserver()

發生問題場景 系統頁面使用tabs標簽頁,當有多個組件&#xff0c;有使用eCharts圖表的頁面時&#xff0c;其中的一個頁面或其他頁面使用了F11的頁面全屏&#xff0c;關閉全屏后圖表會收縮起來(注:固定eCharts的width、height 的參數值是無影響&#xff0c;按照固定參數大小展示)…