多線程和線程同步

多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性

提高程序的并發性:1.多線程,對系統資源的消耗更小一些

                                2.多進程

系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,就處于一個就緒態,就緒態的線程沒有cpu的使用權 ,搶到cpu的時間片后,就處于運行態

linux里的多線程

線程概述

線程是輕量級的進程(LWP:light weight process),在Linux環境下線程的本質仍是進程。在計算機上運行的程序是一組指令及指令參數的組合,指令按照既定的邏輯控制計算機運行。操作系統會以進程為單位,分配系統資源,可以這樣理解,進程是資源分配的最小單位,線程是操作系統調度執行的最小單位。

先從概念上了解一下線程和進程之間的區別:

進程有自己獨立的地址空間, 多個線程共用同一個地址空間

線程更加節省系統資源, 效率不僅可以保持的, 而且能夠更高
在一個地址空間中多個線程獨享: 每個線程都有屬于自己的棧區, 寄存器(內核中管理的)
在一個地址空間中多個線程共享: 代碼段, 堆區, 全局數據區, 打開的文件(文件描述符表)都是線程共享的
線程是程序的最小執行單位, 進程是操作系統中最小的資源分配單位

每個進程對應一個虛擬地址空間,一個進程只能搶一個CPU時間片
一個地址空間中可以劃分出多個線程, 在有效的資源基礎上, 能夠搶更多的CPU時間片

在處理多任務程序的時候使用多線程比使用多進程要更有優勢,但是線程并不是越多越好,如何控制線程的個數呢?

文件IO操作:文件IO對CPU是使用率不高, 因此可以分時復用CPU時間片, 線程的個數 = 2 * CPU核心數 (效率最高)

處理復雜的算法(主要是CPU進行運算, 壓力大),線程的個數 = CPU的核心數 (效率最高)

2.創建線程
只要是線程都有唯一一個線程id,id類型為pthread_t

pthread_t pthread_self(void);    // 返回當前線程的線程ID

在一個進程中調用線程創建函數,就可得到一個子線程,和進程不同,需要給每一個創建出的線程指定一個處理函數,否則這個線程無法工作。

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);
// Compile and link with -pthread, 線程庫的名字叫pthread, 全名: libpthread.so libptread.a

pthread_t *thread傳出參數

const pthread_attr_t *attr,線程屬性

void *(*start_routine) (void *)函數指針,做會調用的,指針所指向的函數,就是在子線程里要執行的任務

void *arg任務函數的參數

回調函數,是由線程去調用的,而不是由程序員去調用的,因此程序員只需要把回調函數的任務寫出來

2.2 創建線程
下面是創建線程的示例代碼,在創建過程中一定要保證編寫的線程函數與規定的函數指針類

型一致:void *(*start_routine) (void *):

// pthread_create.c 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>// 子線程的處理代碼
void* working(void* arg)
{printf("我是子線程, 線程ID: %ld\n", pthread_self());for(int i=0; i<9; ++i){printf("child == i: = %d\n", i);}return NULL;
}int main()
{// 1. 創建一個子線程pthread_t tid;pthread_create(&tid, NULL, working, NULL);printf("子線程創建成功, 線程ID: %ld\n", tid);// 2. 子線程不會執行下邊的代碼, 主線程執行printf("我是主線程, 線程ID: %ld\n", pthread_self());for(int i=0; i<3; ++i){printf("i = %d\n", i);}// 休息, 休息一會兒...// sleep(1);return 0;
}

3. 線程退出
在編寫多線程程序的時候,如果想要讓線程退出,但是不會導致虛擬地址空

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

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

相關文章

時序數據預測:TDengine 與機器學習框架的結合(一)

一、引言 在當今數字化時代&#xff0c;時序數據如潮水般涌來&#xff0c;廣泛存在于物聯網、工業監控、金融交易、氣象監測等眾多領域。這些按時間順序記錄的數據蘊含著豐富的信息&#xff0c;對其進行準確預測&#xff0c;能夠為企業和組織的決策提供有力支持&#xff0c;帶…

elementUI中MessageBox.confirm()默認不聚焦問題處理

在項目中使用elementUI的MessageBox.confirm()出現了默認不聚焦的問題&#xff0c;默認確認按鈕是淺色的&#xff0c;需要點擊一下才會變成正常。面對這種問題&#xff0c;創建新組件&#xff0c;實現聚焦。替換默認的MessageBox.confirm() 解決 創建components/MessageBoxCo…

yarn的定義

YARN 即 Yet Another Resource Negotiator&#xff0c;它是 Apache Hadoop 2.x 及后續版本中的集群資源管理系統&#xff0c;也是 Hadoop 生態系統的核心組件之一。 YARN 的誕生是為了解決 Hadoop 1.x 中 MapReduce 框架將資源管理和作業調度任務耦合在一起所帶來的可擴展性差等…

http、https、TLS、證書原理理解,對稱加密到非對稱加密問題,以及對應的大致流程

http 超文本傳輸協議 存在問題&#xff1a; 安全性、隱私性、數據完整性 易被中間人&#xff08;黑客之類的&#xff09;對數據進行劫持、篡改、隱私泄露 引出了 https &#xff08;source&#xff09; http 在網絡模型中的應用層 Application > transport > inter…

深度補全網絡:如CSPN++填補稀疏點云的深度信息

深度補全網絡&#xff1a;CSPN填補稀疏點云的深度信息 深度補全(Depth Completion)是計算機視覺中的一個重要任務&#xff0c;旨在從稀疏的深度測量中恢復密集的深度圖。CSPN(Convolutional Spatial Propagation Network)是這一領域的前沿方法之一。 CSPN概述 CSPN是對原始CSPN…

QT網絡拓撲圖繪制實驗

前言 在網絡通訊中&#xff0c;我qt常用的是TCP或者UDP協議&#xff0c;就比方說TCP吧&#xff0c;一臺服務器有時可能會和多臺客戶端相連接&#xff0c;我之前都是處理單鏈接情況&#xff0c;最近研究圖結構的時候&#xff0c;突然就想到了這個問題。那么如何解決這個問題呢&…

DNS主從同步實驗

dns域名解析原理 實驗步驟1、主dns要完成dns解析&#xff1a;192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…

知識了解03——怎么解決使用npm包下載慢的問題?

1、為什么使用npm下載包會下載的慢 因為使用npm下載包時&#xff0c;默認使用國外服務器進行下載&#xff0c;此時的網絡傳輸需要經過漫長的海底電纜&#xff0c;因此下載速度會變慢 2、怎么解決&#xff1f;&#xff08;切換鏡像源&#xff09; &#xff08;1&#xff09;方…

在Ubuntu系統中安裝和升級RabbitVCS

在Ubuntu系統中安裝和升級RabbitVCS 目前在ubuntu中使用svn的GUI工具&#xff0c;已經安裝了。想升級一下。 當前遇到的問題是&#xff0c;我想用它看看我當前的代碼對應的版本號&#xff0c;然后再決定是否update。但是&#xff0c;好像我看不出來。根本不如在windows使用To…

cv::dnn::NMSBoxes和nms-free的比較

1. 原理與目標 cv::dnn::NMSBoxes 基于傳統的非極大值抑制&#xff08;NMS&#xff09;算法&#xff0c;通過交并比&#xff08;IoU&#xff09;篩選重疊框&#xff0c;保留置信度最高的框&#xff0c;抑制冗余檢測。支持變體如 Soft-NMS&#xff08;通過降低分數而非直接抑制&…

React-useImperativeHandle (forwardRef)

我們會遇到這樣的場景&#xff1a;某個組件想要暴露一些方法&#xff0c;來供外部組件來調用。例如我們在開發form表單的時候&#xff0c;就需要把設置表單值、重置值、提交等方法暴露給外部使用。會有如下代碼&#xff1a; import { forwardRef } from react;const Form for…

多人五子棋聯機對戰平臺 測試報告

目錄 項目介紹 測試用例設計 部分功能測試示例 自動化測試 測試范圍 排除范圍 自動化測試目錄?編輯 執行全部自動化測試用例 性能說明 總結 性能測試 結果分析 測試總結 項目介紹 該項目基于WebSocket實現實時通信&#xff0c;采用SSM框架構建在線五子棋多人聯機…

JAVAEE(網絡原理—UDP報頭結構)

我們本篇文章要講的是UDP的報頭結構以及注意事項。 下面呢&#xff0c;我先說一下UDP是什么&#xff1f; 1.UDP是什么&#xff1f; UDP是一種網絡協議。網絡協議是計算機網絡中&#xff0c;為了使不同設備之間能夠準確、高效地進行數據交換和通信&#xff0c;而預先制定的一…

STM32學習筆記匯總

所有學習資料均參考b站江科大&#xff0c;和鐵山羊 一.創建工程&#xff08;比較麻煩&#xff0c;而且時間長了就容易忘記&#xff09; 二.點燈大師&#xff08;成功的第一步&#xff09; 三.不同的燒錄器使用&#xff08;Jlink-stlink&#xff09;

【MySQL】SQL語句在MySQL中的執行過程?主要存儲引擎區別?

MySQL SQL語句執行過程詳解 作為面試官&#xff0c;我來詳細剖析一條SQL語句在MySQL中的完整執行過程&#xff0c;這是每個后端開發者都應該掌握的核心知識。 一、連接階段 建立連接 客戶端通過TCP/IP協議與MySQL服務器建立連接(默認3306端口)服務器驗證用戶名、密碼和權限…

【記錄】服務器安裝ffmpeg

前言 因為項目中需要用到 ffmpeg 進行圖像的一些操作,本文記錄下在服務器安裝 ffmpeg 的全過程,還是具有一定挑戰性的。 系統詳情 本文使用的操作系統詳情如下 通過 命令 cat /etc/os-release 獲取 雖然操作系統為 Rocky Linux,但安裝過程是通用的,因為本文記錄的是從源代碼…

Django之modelform使用

Django新增修改數據功能優化 目錄 1.新增數據功能優化 2.修改數據功能優化 在我們做數據優化處理之前, 我們先回顧下傳統的寫法, 是如何實現增加修改的。 我們需要在templates里面新建前端的頁面, 需要有新增還要刪除, 比如說員工數據的新增, 那需要有很多個輸入框, 那html…

HTML5 應用程序緩存:原理、實踐與演進

在 Web 技術的發展歷程中&#xff0c;HTML5 引入的應用程序緩存&#xff08;Application Cache&#xff09;曾是提升 Web 應用離線體驗的重要技術。它允許 Web 應用進行緩存&#xff0c;使用戶在沒有因特網連接時也能訪問應用&#xff0c;為 Web 應用帶來了顯著的優勢。然而&am…

【問題筆記】解決python虛擬環境運行腳本無法激活問題

【問題筆記】解決python虛擬環境運行腳本無法激活問題 錯誤提示問題所在解決方法**方法 1&#xff1a;臨時更改執行策略****方法 2&#xff1a;永久更改執行策略** **完整流程示例** 錯誤提示 PS F:\PythonProject\0419graphrag-local-ollama-main> venv1\Scripts\activate…

解決echarts餅圖label顯示不全的問題

解決辦法 添加如下配置&#xff1a; labelLayout: {hideOverlap: false},