Linux操作系統軟件編程——多線程

什么是線程

線程的定義

? ? ? ? 是輕量級的進程,可以實現多任務的并發。線程是操作系統任務調度的最小單位

線程的創建

????????由某個進程創建,且進程創建線程時,會為其分配獨立的棧區空間(默認8M)。線程和所在的進程,以及進程中的其他線程,共用進程的堆區、文本區、數據區

線程的調度

????????宏觀并行,微觀串行

進程和線程的區別

進程線程
單位操作系統資源分配的最小單位操作系統任務調度的最小單位
資源消耗資源消耗開銷大,每次創建都需要有0-4G的虛擬內存空間資源消耗開銷較小,只需要由所在進程為其開辟默認8M的棧區空間
效率由操作系統創建,創建耗時大,跨進程調度慢由進程創建,創建耗時小,跨線程調度快
通信進程間不能直接通信,需要使用進程間通信機制(IPC)通信簡單,可以使用線程共享的區域通信(例如全局變量)
安全性安全性較高,因為各個進程空間獨立安全性較低,一個線程異常,可能影響同一進程中的線程

線程相關編程

? ? ? ? 線程的創建:pthread_read();pthread_self():獲取當前線程的ID號

? ? ? ? 線程的調度:由操作系統調度

? ? ? ? 線程的凋亡:

? ? ? ? ? ? ? ? 1,線程退出:在線程任務函數中使用return結束線程或者調用pthread_exit()結束線程

? ? ? ? ? ? ? ? 2,線程回收:pthread_join(tid,NULL)

pthread_create()

? ? ? ? 功能:創建一個新的線程

? ? ? ? 參數:

? ? ? ? ? ? ? ? thread:保存線程ID的變量地址

? ? ? ? ? ? ? ? attr:線程屬性的對象地址,如果是NULL則按照默認屬性創建

? ? ? ? ? ? ? ? void *(*start_routine)(void *):函數指針,指向線程啟動后要執行的任務

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指針名稱:start_routine

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指向的對象:函數void *()(void *)

? ? ? ? ? ? ? ? arg:為線程任務函數傳遞的參數,如果不傳參則傳NULL

? ? ? ? 返回值:成功則為0,失敗則為!0

? ? ? ? 需要注意的是,在使用這個函數時,需要在創建或者編譯時加上后綴,如圖所示

? ? ? ? 當進程中創建了線程,不要直接退出進程(線程之后就接return),在return之前設立一個死循環或者sleep,否則可能線程還未執行,進程就優先結束,連帶著線程也結束

pthread_exit()

? ? ? ? 功能:退出一個線程任務

? ? ? ? 參數:向回收的線程傳遞的參數的地址,如果不傳遞參數則為NULL

? ? ? ? pthread_exit(NULL)等價于return NULL

pthread_join()

? ? ? ? 功能:阻塞等待回收線程資源空間

? ? ? ? 參數:要回收的線程ID;用來保存線程退出時傳遞的參數,NULL表示不接收傳遞的參數

? ? ? ? 返回值:成功為0,失敗為-1

線程屬性

? ? ? ? 1,分離屬性:不需要被其他線程回收的線程,將來會被操作系統回收

? ? ? ? 2,非分離屬性:可以被其他線程回收或者結束的線程,默認屬性為非分離屬性

線程回收策略

? ? ? ? 1,分離屬性的線程:不需要回收(沒有空閑的線程可以幫忙回收)

? ? ? ? 2,調用pthread_join阻塞回收

int pthread_detach(pthread_t thread)

? ? ? ? 功能:將線程設置成分離屬性的線程

線程間通信

? ? ? ? 臨界資源:多個線程可以同時訪問的資源,例如全局變量,共享內存區域

? ? ? ? 然而,在多個線程在訪問臨界資源時,會存在資源競爭問題,如下

? ? ? ? 如果按照代碼正常思路,最后輸出應該是200000,但是最后卻輸出199997,這是由于對于全局變量n,其中一個線程調用并進行操作,還未將結果重新賦予時,另一個線程也進行了調用,導致兩個線程賦予了同一個值。

????????事實上,數字越大越容易出現這種情況,但是并不代表每次運行都會出現這種情況,所以為了完全避免這種資源競爭問題,需要用到互斥機制

互斥機制

? ? ? ? 互斥機制:多個線程訪問臨界資源時,具有排他性訪問的機制,即一次只允許一個線程對該臨界資源進行訪問

? ? ? ? 實現互斥機制的步驟

? ? ? ? ? ? ? ? 1,創建互斥鎖:pthread_mutex_t

? ? ? ? ? ? ? ? 2,初始化互斥鎖:pthread_mutex_init

? ? ? ? ? ? ? ? 3,鎖上:int pthread_mutex_lock(pthread_mutex_t *mutex)

? ? ? ? ? ? ? ? 4,解鎖:int pthread_mutex_unlock(pthread_mutex_t *mutex)

? ? ? ? ? ? ? ? 5,銷毀鎖:int pthread_mutex_destroy(pthread_mutex_t *mutex)

pthread_mutex_init

? ? ? ? 功能:初始化互斥鎖

? ? ? ? 參數:鎖住對象的地址;鎖的屬性,如果是NULL則為默認屬性

? ? ? ? 返回值:成功則為0,失敗則為-1

? ? ? ? 所以上述的例子可改為

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

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

相關文章

linux下找到指定目錄下最新日期log文件

以下是一個完整的C函數&#xff0c;用于在指定目錄下自動查找最近更新的日志文件&#xff08;根據文件名中的時間戳選擇最新的文件&#xff09;&#xff1a;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include…

《數學模型》經典案例——鋼管的訂購與運輸

一、問題描述 要鋪設一條 A1→A2→?→A15A_1 \rightarrow A_2 \rightarrow \cdots \rightarrow A_{15}A1?→A2?→?→A15? 的輸送天然氣的主管道&#xff0c;如圖 6.22 所示。經篩選后可以生產這種主管道鋼管的鋼廠有 S1,S2,?,S7S_1, S_2, \cdots, S_7S1?,S2?,?,S7? 。…

Java Web部署

今天小編來分享下如何將本地寫的Java Web程序部署到Linux上。 小編介紹兩種方式&#xff1a; 部署基于Linux Systemd服務、基于Docker容器化部署 首先部署基于Linux Systemd服務 那么部署之前&#xff0c;要對下載所需的環境 軟件下載 Linux&#xff08;以ubuntu&#xf…

告別AI“煉丹術”:“策略懸崖”理論如何為大模型對齊指明科學路徑

摘要&#xff1a;當前&#xff0c;我們訓練大模型的方式&#xff0c;尤其是RLHF&#xff0c;充滿了不確定性&#xff0c;時常產生“諂媚”、“欺騙”等怪異行為&#xff0c;被戲稱為“煉丹”。一篇來自上海AI Lab的重磅論文提出的“策略懸崖”理論&#xff0c;首次為這個混沌的…

深入理解C#特性:從應用到自定義

——解鎖元數據標記的高級玩法&#x1f4a1; 核心認知&#xff1a;特性本質揭秘 public sealed class ReviewCommentAttribute : System.Attribute { ... }特性即特殊類&#xff1a;所有自定義特性必須繼承 System.Attribute&#xff08;基礎規則&#xff09;命名規范&#xff…

機器學習-集成學習(EnsembleLearning)

0 結果展示 0.1 鳶尾花分類 import pandas as pd import numpy as npfrom sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, recall_score, f1_score, classification_repo…

Golang database/sql 包深度解析(一)

database/sql 是 Go 語言標準庫中用于與 SQL&#xff08;或類 SQL&#xff09;數據庫交互的核心包&#xff0c;提供了一套輕量級、通用的接口&#xff0c;使得開發者可以用統一的方式操作各種不同的數據庫&#xff0c;而無需關心底層數據庫驅動的具體實現。 核心設計理念 datab…

文章自然潤色 API 數據接口

文章自然潤色 API 數據接口 ai / 文本處理 基于 AI 的文章潤色 專有模型 / 智能糾錯。 1. 產品功能 基于自有專業模型進行 AI 智能潤色對原始內容進行智能糾錯高效的文本潤色性能全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 / v1.3&#xff09;&#xff1b;全面兼容…

【狀壓DP】3276. 選擇矩陣中單元格的最大得分|2403

本文涉及知識點 C動態規劃 3276. 選擇矩陣中單元格的最大得分 給你一個由正整數構成的二維矩陣 grid。 你需要從矩陣中選擇 一個或多個 單元格&#xff0c;選中的單元格應滿足以下條件&#xff1a; 所選單元格中的任意兩個單元格都不會處于矩陣的 同一行。 所選單元格的值 互…

IDEA 清除 ctrl+shift+r 全局搜索記錄

定位文件&#xff1a;在Windows系統中&#xff0c;文件通常位于C:Users/用戶名/AppData/Roaming/JetBrains/IntelliJIdea(idea版本)/workspace目錄下&#xff0c;文件名為一小串隨機字符&#xff1b;在Mac系統中&#xff0c;文件位于/Users/用戶名/Library/Application /Suppor…

解鎖AI大模型:Prompt工程全面解析

解鎖AI大模型&#xff1a;Prompt工程全面解析 本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型開發 學習視頻/籽料/面試題 都在這>>Github<< 從新手到高手&#xff0c;Prompt 工程究竟是什么&#xff1f; 在當今數字化時代&#xff0c;AI …

HTTP0.9/1.0/1.1/2.0

在HTTP0.9中&#xff0c;只有GET方法&#xff0c;沒有請求頭headers&#xff0c;沒有狀態碼&#xff0c;只能用于傳輸HTML文件。到了HTTP1.0(1996)&#xff0c;HTTP1.0傳輸請求頭&#xff0c;有狀態碼&#xff0c;并且新增了POST和HEAD方法。HTTP1.0中&#xff0c;使用短連接&a…

gitee 流水線+docker-compose部署 nodejs服務+mysql+redis

文章中的方法是自己琢磨出來的&#xff0c;或許有更優解&#xff0c;共同學習&#xff0c;共同進步&#xff01; docker-compose.yml 文件配置&#xff1a; 說明&#xff1a;【配置中有個別字段冗余&#xff0c;但不影響使用】該文件推薦放在nodejs項目的根目錄中&#xff0c…

【算法】模擬專題

什么是模擬&#xff1f; 是一種通過模仿現實世界或問題場景的運行過程來求解問題的算法思想。它不依賴復雜的數學推導或邏輯優化&#xff0c;而是按照問題的實際規則、步驟或流程&#xff0c;一步步地 “復現” 過程&#xff0c;最終得到結果。 使用場景&#xff1a;當問題的邏…

【FreeRTOS】刨根問底6: 應該如何防止任務棧溢出?

【加關注&#xff0c;不迷路】一、棧溢出&#xff1a;程序世界的“越界洪水”就象一個裝水的玻璃杯&#xff08;棧空間&#xff09;&#xff0c;每次調用函數就像向水杯中倒水&#xff08;壓入保護需要恢復的數據&#xff09;。當函數嵌套調用過深&#xff08;如遞歸失控&#…

牛客周賽 Round 105

A.小苯的xor構造題目描述小紅喜歡整數 k&#xff0c;他想讓小苯構造兩個不相等的非負整數&#xff0c;使得兩數的異或和等于 k。請你幫幫小苯。#include <bits/stdc.h> using namespace std; using ll long long; void solve() {int k;cin>>k;cout<<0<&l…

《R for Data Science (2e)》免費中文翻譯 (第4章) --- Workflow: code style

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

11-verilog的RTC驅動代碼

verilog的RTC驅動代碼 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制參數(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模塊的驅動時鐘頻率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(無頭服務)

文章目錄問題背景1、什么是Headless Service1.2 為什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行為1.3 驗證示例1.4 如何創建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何創建出來的&#xff1f;…

scikit-learn/sklearn學習|套索回歸Lasso解讀

【1】引言 前序學習進程中&#xff0c;對用scikit-learn表達線性回歸進行了初步解讀。 線性回歸能夠將因變量yyy表達成由自變量xxx、線性系數矩陣www和截距bbb組成的線性函數式&#xff1a; y∑i1nwi?xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n?wi??xi?bwTxb實…