3. 線程間共享數據

?1. 線程共享數據會造成什么問題?

1.1 讀寫不一致

多線程讀不會造成數據變動,所以沒有問題。只要有一個線程設計修改數據,就會導致數據共享出現問題,簡單的是數據不一致,嚴重的是程序訪問已經釋放的內存,造成程序崩潰。

1.2 順序不一致(競態條件)

1.2.1 為什么要有順序性問題?

因為,讀寫操作的不同,不同的訪問順序是是十分重要的。

1.2.2? 造成順序性問題的原因?

因為,需要改動多處數據,造成必須要保證改動多出數據時每一步的連續(一個線程多處改動,多次改動,都必須搶占cpu,不能允許其他線程在這個過程被其他線程修改)

1.2.3 如何防止惡性的條件競爭?

什么是惡性競爭?可以理解為破壞程序,導致程序崩潰的,讀寫不一致程序還能運行,如果釋放指針,訪問已經釋放的地址導致內存崩潰。

防止惡性競爭的方式有:

  1. 修改數據時,每一步動作不被其他線程搶占。(常見的有:互斥鎖)
  2. 使用事務,也就是原子操作。(mysql的事務,redis中lua腳本)

2. 互斥方式保護共享數據

2.1 互斥鎖

通過std::mutex,然后調用lock和unlock函數。但是通過unlock,則需要在每一個訪問共享數據的線程上都調用unlock,同時也要注意拋出異常的問題,所以采用了基于RAII機制lock_guard()函數,構造時加鎖,析構時釋放鎖。

缺點:一旦有暴漏的引用或者指針,那么訪問加鎖后,仍然能夠被訪問(可以推導出,加鎖并不是鎖內存,很可能就是鎖變量的訪問)。就是:你要訪問共享變量,你就需要對所有的訪問共享變量的環節都互斥鎖,進行訪問,不然的話如果通過指針或者引用去訪問內存時,是無法解決這個問題的。

class some_data
{int a;std::string b;
public:void do_something();
};class data_wrapper
{
private:some_data data;std::mutex m;
public:template<typename Function>void process_data(Function func)  {std::lock_guard<std::mutex> l(m);func(data);   1.受保護的線程安全的函數,如果多線程訪問該函數的時候,就一定線程安全,因為使用了互斥鎖。}
};some_data* unprotected;void malicious_function(some_data& protected_data)
{unprotected=&protected_data;
}data_wrapper x;void foo()
{x.process_data(malicious_function);   2.如果你某天添加功能,以引用或者指針的方式向外部調用恭喜那個變量,這個時候就是非線程安全了,因為malicious_function是非線程安全的。unprotected->do_something();   以無保護方式訪問本應受保護的共享數據
}

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

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

相關文章

JAVA垃圾回收算法和判斷垃圾的算法

一、判斷垃圾的算法 判斷對象是否為垃圾的核心是確定對象是否不再被使用。Java主要采用以下兩種算法&#xff1a; 1. 引用計數法&#xff08;Reference Counting&#xff09; 原理&#xff1a;每個對象維護一個引用計數器&#xff0c;記錄被引用的次數。當引用被添加時計數器…

界面架構 - MVVM (Qt)

MVVM MVVM 的主要特點示例示例功能示例代碼ViewModel 類&#xff08;C&#xff09;主函數入口&#xff08;main.cpp&#xff09; QML 文件&#xff08;main.qml&#xff09;總結 MVVM&#xff08;Model-View-ViewModel&#xff09;架構是一種旨在進一步分離界面和業務邏輯的設計…

第十四屆MathorCup高校數學建模挑戰賽-C題:基于 LSTM-ARIMA 和整數規劃的貨量預測與人員排班模型

目錄 摘要 一、 問題重述 1.1 背景知識 1.2 問題描述 二、 問題分析 2.1 對問題一的分析 2.2 對問題二的分析 2.3 對問題三的分析 2.4 對問題四的分析 三、 模型假設 四、 符號說明 五、 問題一模型的建立與求解 5.1 數據預處理 5.2 基于 LSTM 的日貨量預測模型 5.3 日貨量預測…

銀河麒麟V10 aarch64架構安裝mysql教程

國產操作系統 ky10.aarch64 因為是arm架構&#xff0c;故選擇mysql8&#xff0c;推薦安裝8.0.28版本 嘗試8.0.30和8.0.41版本均未成功&#xff0c;原因不明?? 1. 準備工作 ? 下載地址&#xff1a;https://downloads.mysql.com/archives/community/ 2. 清理歷史環境 不用管…

C++多繼承

可以用多個基類來派生一個類。 格式為&#xff1a; class 類名:類名1,…, 類名n { private: … &#xff1b; //私有成員說明; public: … &#xff1b; //公有成員說明; protected: … &#xff1b; //保護的成員說明; }; class D: public A, protected B, private C { …//派…

某地老舊房屋自動化監測項目

1. 項目簡介 自從上個世紀90年代以來&#xff0c;我國經濟發展迅猛&#xff0c;在此期間大量建筑平地而起&#xff0c;并且多為磚混結構的住房&#xff0c;使用壽命通常約為30-50年&#xff0c;鋼筋混凝土結構&#xff0c;鋼結構等高層建筑&#xff0c;這些建筑在一般情況下的…

產品經理的大語言模型課 04 -模型應用的云、邊、端模式對比

目錄 算力部署方式的影響因素數據量計算難度前期投入數據隱私應用規模與泛化能力 云、邊、端部署的特點和對比典型場景舉例社區人臉門禁后廚老鼠識別 未來展望 算力部署方式的影響因素 最近和人工智能從業者進行了非常廣泛的溝通&#xff0c;嘗試對模型應用的云、邊、端模式進…

基于Python設計的TEQC數據質量可視化分析軟件

標題:基于Python設計的TEQC數據質量可視化分析軟件 內容:1.摘要 本文旨在設計一款基于Python的TEQC數據質量可視化分析軟件。隨著全球導航衛星系統&#xff08;GNSS&#xff09;的廣泛應用&#xff0c;數據質量的評估變得至關重要。TEQC&#xff08;TransEditQualityCheck&…

Flinksql--訂單寬表

參考&#xff1a; https://chbxw.blog.csdn.net/article/details/115078261 (datastream 實現) 一、ODS 模擬訂單表及訂單明細表 CREATE TABLE orders (order_id STRING,user_id STRING,order_time TIMESTAMP(3),-- 定義事件時間及 Watermark&#xff08;允許5秒亂序&#x…

粒子濾波介紹

目錄 粒子濾波的主要流程可以分為以下 5 個步驟&#xff1a; 粒子濾波&#xff08;PF&#xff09; vs. ESKF&#xff08;誤差狀態卡爾曼濾波&#xff09; 粒子濾波的主要流程可以分為以下 5 個步驟&#xff1a; 初始化&#xff08;Initialization&#xff09; 生成 N 個粒子&…

一場國際安全廠商的交流會議簡記

今天參與了一場國際安全廠商A公司組織的交流會議 與會有國際TOP企業跨境企業 還有國內一些頭部商業公司。 A公司很有意思介紹了自己是怎么做安全運營中心SOC的。 介紹了很多內容&#xff0c;包括他們自己的員工量/設備量/事件量/SOC中心人員量&#xff0c;其中人員量只有個位數…

Java面試黃金寶典30

1. 請詳細列舉 30 條常用 SQL 優化方法 定義 SQL 優化是指通過對 SQL 語句、數據庫表結構、索引等進行調整和改進&#xff0c;以提高 SQL 查詢的執行效率&#xff0c;減少系統資源消耗&#xff0c;提升數據庫整體性能的一系列操作。 要點 從索引運用、查詢語句結構優化、數據…

花灑洗澡完畢并關閉后過段時間會突然滴水的原因探究

洗澡完畢后的殘留水 在洗澡的過程中&#xff0c;我們通常會使用到大量的水。這些水會通過花灑管子到達花灑頂噴流出。由于大頂噴花灑的噴頭較大&#xff0c;關閉后里面的存水會更多。 氣壓失衡后的滴水 當花灑關閉后&#xff0c;內部的水管和花灑頭中仍存有一定量的水。由于…

QSettings用法實戰(相機配置文件的寫入和讀取)

很多情況&#xff0c;在做項目開發的時候&#xff0c;將參數獨立出來是比較好的方法 例如&#xff1a;相機的曝光次數、曝光時長等參數&#xff0c;獨立成ini文件&#xff0c;用戶可以在外面修改即可生效&#xff0c;無需在動代碼重新編譯等工作 QSettings便可以實現該功能 內…

運維培訓班之最佳選擇(The best Choice for Operation and Maintenance Training Courses)

運維培訓班之最佳選擇 從面試官的角度聊聊培訓班對運維的幫助&#xff0c;同時給培訓班出身的運維一些建議~ 談到運維&#xff08;尤其是零基礎非科班轉行的運維&#xff09;找工作&#xff0c;培訓班是個不可回避的討論熱點。雖然本人也做過兼職運維培訓老師&#xff0c;多少…

網絡安全與防護策略

隨著信息技術的飛速發展&#xff0c;互聯網已成為現代社會不可或缺的一部分。從日常生活到企業運營&#xff0c;幾乎所有活動都離不開網絡。然而&#xff0c;網絡的開放性和廣泛性也使得網絡安全問題愈發嚴峻。無論是個人數據泄露&#xff0c;還是大規模的網絡攻擊&#xff0c;…

LLM 分詞器Tokenizer 如何從 0 到 1 訓練出來

寫在前面 大型語言模型(LLM)處理的是人類的自然語言,但計算機本質上只能理解數字。Tokenizer(分詞器) 就是架在自然語言和計算機數字表示之間的一座至關重要的橋梁。它負責將我們輸入的文本字符串分解成模型能夠理解的最小單元——Token,并將這些 Token 轉換成對應的數字…

【ArcGIS微課1000例】0142:如何從谷歌地球保存高清影像圖片

文章目錄 一、選取影像區域1. 搜索地圖區域2. 導入矢量范圍二、添加輸出圖層三、保存高清影像1. 地圖選項2. 輸出分辨率3. 保存圖像四、注意事項一、選取影像區域 首先需要選取影像區域,可通過以下方式快速定位。 1. 搜索地圖區域 在搜索框內輸入關鍵詞,例如青海湖,點擊【…

Unity注冊表修改分辨率:探索幕后設置與手動調控

Unity注冊表修改分辨率&#xff1a;探索幕后設置與手動調控 在Unity開發中&#xff0c;調整分辨率和顯示模式是開發過程中常見的需求&#xff0c;尤其是當我們打包并運行應用時&#xff0c;可能會遇到顯示模式不符合預期的情況。Unity在首次運行時會自動保存這些設置&#xff…

外部流輸入的 Layer

在 Android 的 SurfaceFlinger 體系中&#xff0c;外部流輸入的 Layer 通常通過 Sideband Stream 或 BufferQueue 機制傳遞給 SurfaceFlinger&#xff0c;然后由 HWC&#xff08;Hardware Composer&#xff09;或 OpenGL ES 進行合成。 1. 什么是外部流輸入的 Layer&#xff1f…