Linux 第三十五章

🐶博主主頁:@??. 一懷明月??

???🔥專欄系列:線性代數,C初學者入門訓練,題解C,C的使用文章,「初學」C++,linux

🔥座右銘:“不要等到什么都沒有了,才下定決心去做”

🚀🚀🚀大家覺不錯的話,就懇求大家點點關注,點點小愛心,指點指點🚀🚀🚀

目錄

互斥鎖

scp指令

線程加鎖的本質

可重入VS線程安全(多執行流并發執行同一段代碼時造成的數據不一致)

死鎖

線程同步

生產者消費者模型

條件變量

pthread_cond_wait

pthread_cond_signal

pthread_cond_broadcast

事例:火車票搶購


互斥鎖

創建全局的鎖

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//創建全局的鎖,用宏去初始化

創建局部的鎖

pthread_mutex_t mutex;//創建局部鎖的時候不用宏初始化
pthread_mutex_init(&mutex);//初始化
pthread_mutex_destroy(&mutex);//局部的鎖,不用時要銷毀

scp指令

scp指令是用于在Linux系統中進行文件傳輸的命令,

其語法如下:

scp [選項] [源文件] [目標文件]
常用選項包括:* -r:遞歸復制整個目錄
* -P:指定端口號
* -p:保持源文件的修改時間、訪問時間和權限信息
* -q:安靜模式,不顯示傳輸進度信息
示例用法:1. 從本地復制文件到遠程服務器:
scp /path/to/local/file username@remotehost:/path/to/remote/directory2. 從遠程服務器復制文件到本地:
scp username@remotehost:/path/to/remote/file /path/to/local/directory3. 從遠程服務器復制整個目錄到本地:
scp -r username@remotehost:/path/to/remote/directory /path/to/local/directory

線程加鎖的本質

關于加鎖的原則,一般原則:誰加鎖,誰解鎖

可重入VS線程安全(多執行流并發執行同一段代碼時造成的數據不一致)

可重入函數是線程安全函數的一種

線程安全不一定是可重入的,而可重入函數則一定是線程安全的。

如果將對臨界資源的訪問加上鎖,則這個函數是線程安全的,但如果這個重入函數若鎖還未釋放則會產生死鎖,因此是不可重入的。

死鎖

原因

1)當兩個線程需要都需要兩把鎖,而它們每一個線程只有一把鎖,此時就會導致死鎖

2)當一個線程在加鎖的時候,沒有解鎖,又去加鎖,這樣就會導致死鎖

…….

死鎖必要條件(產生死鎖的時候,這四個條件一定是滿足的)

互斥條件:一個資源每次只能被一個執行流使用

請求與保持條件:一個執行流因請求資源而阻塞時,對已獲得的資源保持不放

不剝奪條件:一個執行流已獲得的資源,在末使用完之前,不能強行剝奪

循環等待條件:若干執行流之間形成一種頭尾相接的循環等待資源的關系

避免死鎖

破壞死鎖的四個必要條件

加鎖順序一致

避免鎖未釋放的場景

資源一次性分配

線程同步

線程同步的概念:

在臨界資源使用安全的前提下,讓多線程執行具有一定的順序性——同步

互斥:能夠保證資源的安全性

同步:能夠較為充分使用我們的資源

生產者消費者模型

3種關系

生產者之間關系,互斥

消費者之間關系,互斥

生產者與消費者之間關系,互斥和同步

本質:就是用鎖和條件變量,維護

2種角色

生產者,消費者——線程或者進程

1個交易場所

內存空間

生產者消費者模型提高了數據處理的能力

條件變量

創建條件變量

pthread_cond_t cond;

全局的條件變量初始化

cond=PTHREAD_COND_INITIALIZER

局部條件變量的初始化

Pthread_cond_init(&cond);

局部條件變量需要銷毀

pthread_cond_destory(&cond);

pthread_cond_wait

pthread_cond_wait() 是 POSIX 線程庫中的一個函數,用于線程間的條件變量同步。它需要與互斥鎖(mutex)和條件變量(condition variable)一起使用。
函數原型如下:

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);pthread_cond_wait() 的作用是讓調用線程等待條件變量的滿足。在調用該函數之前,
必須先使用 pthread_mutex_lock() 鎖住一個互斥鎖,以確保線程安全。
當條件變量滿足時,pthread_cond_wait() 函數會解鎖互斥鎖并使線程進入等待狀態,
直到被其他線程通過 pthread_cond_signal() 或 pthread_cond_broadcast() 喚醒。

使用示例:

#include <pthread.h>
// 全局互斥鎖和條件變量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* thread_func(void* arg) {// 獲取互斥鎖pthread_mutex_lock(&mutex);// 等待條件變量滿足pthread_cond_wait(&cond, &mutex);// 條件變量滿足后的處理// 解鎖互斥鎖pthread_mutex_unlock(&mutex);return NULL;
}
int main() {pthread_t thread;// 創建線程pthread_create(&thread, NULL, thread_func, NULL);// 在某個時刻滿足條件,并通知等待的線程pthread_mutex_lock(&mutex);pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);// 等待線程結束pthread_join(thread, NULL);return 0;
}

在上面的示例中,主線程通過 pthread_cond_signal() 喚醒等待的線程。當滿足條件時,等待的線程會被喚醒并繼續執行。注意,在調用 pthread_cond_wait() 之前必須加鎖(pthread_mutex_lock()),并在條件滿足后解鎖(pthread_mutex_unlock())。

pthread_cond_signal

pthread_cond_signal() 是 POSIX 線程庫中的一個函數,用于喚醒等待在條件變量上的一個線程。它會選擇一個等待的線程,并通知該線程條件已經滿足,使得該線程從等待狀態恢復到運行狀態。

函數原型如下:

int pthread_cond_signal(pthread_cond_t* cond);
pthread_cond_signal() 的作用是發送一個信號給等待在條件變量上的某個線程,
使其從等待狀態返回。如果有多個線程等待在條件變量上,那么只有其中一個線程會被喚醒,
具體哪個線程被喚醒則不確定。

pthread_cond_broadcast

pthread_cond_broadcast() 是 POSIX 線程庫中的一個函數,用于廣播喚醒所有等待在條件變量上的線程。當條件滿足時,可以使用 pthread_cond_broadcast() 函數來喚醒所有等待在該條件變量上的線程,讓它們從等待狀態返回到運行狀態。
?

函數原型如下:

int pthread_cond_broadcast(pthread_cond_t* cond);
pthread_cond_broadcast() 的作用是向所有等待在條件變量上的線程發送信號,
使它們全部被喚醒。所有被喚醒的線程都會嘗試重新獲取互斥鎖,并繼續執行。

1.讓線程在進行等待的時候,會自定釋放鎖

2.線程被喚醒的時候,是在臨界區內喚醒的,當線程被喚醒的時候,線pthread_cond_wait返回的時候要重新申請并持有鎖

3.當線程被喚醒的時候,重新申請并持有鎖的本質是也要參與鎖的競爭

單純的互斥,能保證數據的安全,不一定合理高效!

事例:火車票搶購

test_cond

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//條件變量
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//鎖int tickets=1000;void* threadroutine(void* args)
{string name=static_cast<const char*>(args);while(true){// sleep(1);pthread_mutex_lock(&mutex);//加鎖if(tickets>0){cout<<name<<", get a ticket: "<<tickets--<<endl;usleep(100);}else{cout<<"沒票了"<<name<<endl;pthread_cond_wait(&cond,&mutex);//讓線程滿足條件變量,才被喚醒//1.讓線程在進行等待的時候,會自動釋放鎖//2.線程被喚醒的時候,是在臨界區內喚醒的,當線程被喚醒的時候,線程pthread_cond_wait返回的時候//要重新申請并持有鎖//3.當線程被喚醒的時候,重新申請并持有鎖的本質是也要參與鎖的競爭}pthread_mutex_unlock(&mutex);}
}//主線程
int main()
{pthread_t t1,t2,t3;pthread_create(&t1,nullptr,threadroutine,(void*)"thread - 1");pthread_create(&t2,nullptr,threadroutine,(void*)"thread - 2");pthread_create(&t3,nullptr,threadroutine,(void*)"thread - 3");sleep(5);//主線程5s之后,開始喚醒一個線程while(true){// sleep(1);// pthread_cond_signal(&cond);sleep(20);//休息20s再放一批票pthread_mutex_lock(&mutex);tickets+=1000;pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond);//讓一個線程被喚醒,才后這個線程在去搶票}pthread_join(t1,nullptr);pthread_join(t2,nullptr);pthread_join(t3,nullptr);return 0;
}

火車票搶購,其中會同時出現多個人(線程)去搶購票,所有的搶票的過程一定要是原子的,所以需要加互斥鎖。還有一個問題,在上面的搶票過程中,會在一段時間增加票的數量,但總不能讓某一個人(線程)把這些票都搶光吧!所以就需要條件變量,當這次票完的時候,將這個線程阻塞住,只有被喚醒才可以繼續參與搶票。

?🌸🌸🌸如果大家還有不懂或者建議都可以發在評論區,我們共同探討,共同學習,共同進步。謝謝大家! 🌸🌸🌸??

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

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

相關文章

Kubernetes安裝calico網絡插件失敗

今天啥也沒干成&#xff0c;不想排版了。 接著昨天搭建k8s集群&#xff0c;安裝calico插件&#xff0c;虛擬機一直卡。 # 在 master 節點上執行 # 下載 calico 配置文件&#xff0c;可能會網絡超時 curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O # 修…

[svelte] 怎么引入fortawesome的icon樣式

首先在項目的終端下執行以下命令 npm install fortawesome/fontawesome-free # 或者 yarn add fortawesome/fontawesome-free這樣子可以把fontawsome的圖標給下載到項目的對應文件中 一般都是在node_modules中 在fontawsome/fontawesome-free中就可以看到很多文件夾了 …

unapp寫微信小程序封裝水印相機組件怎么實現?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">編輯資料</block></cu-custom> --><…

Docker學習(10)搭建kubernetes集群

搭建kubernetes集群 1、官方部署方式&#xff1a; Minikube工具安裝 Minikube是一種能夠在計算機或者虛擬機(VM)內輕松運行單節點Kubernetes 集群的工具&#xff0c;可實現一鍵部署。這種方式安裝的系統在企業中大多被當作測試系統使用。 使用yum安裝 通過直接使用 epel-r…

三步在 vite 中配置 tailwindcss

前言 tailwindcss 是一個原子化的 css 工具&#xff0c;可以讓你免于寫 css&#xff0c;只寫 html 即可原理&#xff1a;利用你寫的 html 的 class 名稱來生成 css 樣式&#xff0c;理解為一個 postcss 插件或 loader 第一步&#xff1a;安裝 tailwindcss npm i -D tailwind…

圖片恢復的實用指南,為你拯救遺失的記憶!

隨著科技的日新月異&#xff0c;我們的生活已被照片填滿。它們記錄著我們的喜怒哀樂&#xff0c;見證著每一個重要的時刻。但我們往往會因為各種原因將手機圖片遺失&#xff0c;有什么方法可以恢復呢&#xff1f;本文將提供一份實用的圖片恢復指南&#xff0c;幫助你找回那些遺…

山西大學化學化工學院朱鳳祥教授簡介

男&#xff0c;1989年出生&#xff0c;河南安陽人&#xff0c;2019年1月于山西大學化學化工學院任特聘教授&#xff0c;主要研究方向為有機催化&#xff0c;曾獲國家自然科學基金資助&#xff08;2020-2023&#xff09;&#xff0c;迄今在國際高級雜志發表SCI論文20余篇。 200…

llama使用tutorial微調(windows版本)

Llama3-Tutorial/docs/assistant.md at main SmartFlowAI/Llama3-Tutorial GitHub 有一些命令需要修改 前期的安裝還是要按照教程搞的 streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \ ~/model/Meta-Llama-3-8B-Instruct 改為了 streamlit run .\Ll…

ArrayList和LinkedList的使用

ArrayList List<> list new ArrayList<>(); LinkedList

SQL注入漏洞常用繞過方法

SQL注入漏洞 漏洞描述 Web 程序代碼中對于用戶提交的參數未做過濾就直接放到 SQL 語句中執行&#xff0c;導致參數中的特殊字符打破了原有的SQL 語句邏輯&#xff0c;黑客可以利用該漏洞執行任意 SQL 語句&#xff0c;如查詢數據、下載數據、寫入webshell 、執行系統命令以及…

WPF使用ItemsControl顯示Object的所有屬性值

對于上位機開發&#xff0c;我們有時候有這樣的需求&#xff1a;如何顯示所有的IO點位&#xff1f;比如有10個IO點位&#xff0c;那我們要寫10個TextBlock去綁定這10個點位的屬性&#xff08;本文暫時不考慮顯示的樣式&#xff0c;當然也可以考慮&#xff09;&#xff0c;當點位…

springboot整合swagger,jpa遇到的問題

1.整合jpa&#xff0c;版本問題導致Archive for required library: ‘C:/Users/Administrator/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar’ in project ‘money-server’ cannot be read or is not a valid ZIP file money-server Build path…

Leetcode 257:二叉樹的所有路徑

給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 思路&#xff1a; 先編輯所有節點&#xff0c;記錄每一個節點的路徑&#xff1b; 判斷當前節點是否為葉子節點&#xff0c;如果是&…

霍庭格TruPlasma MF 7100 7050電源現貨50KW

霍庭格TruPlasma MF 7100 7050電源現貨50KW

mysql json 數組怎么搜索

在MySQL中&#xff0c;可以使用JSON_CONTAINS函數來搜索JSON數組中的元素。這里有一個簡單的例子&#xff1a; 假設有一個名為items的表&#xff0c;其中有一個名為attributes的列&#xff0c;包含JSON數組。 CREATE TABLE items (id INT AUTO_INCREMENT PRIMARY KEY,attribu…

SQLSERVER 怎樣使查詢不占鎖

對一些相對不怎么敏感的數據&#xff0c;不需要太及時性的數據&#xff0c;不需要占鎖。 要在SQL Server中執行查詢而不占用鎖&#xff0c;可以采取以下幾個策略&#xff1a; 1、使用NOLOCK提示&#xff1a; 最直接但風險較高的方法是在查詢中使用WITH (NOLOCK)提示。這樣&am…

練習題(2024/5/16)

1輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步: [7,1,2,3,4,5,6] 向右輪轉 2 步: [6,7,1,2,3,4,5] 向右輪轉 3 步: [5,…

【C語言深度解剖】:(11)函數指針、函數指針數組、指向函數指針數組的指針、回調函數

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》《精通C指針》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄…

AVDemo漏洞平臺黑盒測試

信息收集 說明一下&#xff1a; 因為是本地的環境&#xff0c;端口這些就不掃描了&#xff0c; 還有這個是某個dalao寫的平臺&#xff0c;也就檢測不到什么cms了&#xff0c; 信息收集&#xff0c;端口&#xff0c;cms這些是必做的&#xff0c; 首先&#xff0c;這里先簡單的…

web3 ETF軟件開發難點

開發一個涉及到 Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;的軟件可能會面臨一些挑戰和難點&#xff0c;特別是在整合 Web3 技術和金融服務方面。以下是一些可能的難點。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&am…