I/O 線程 7.3

前言

? ? ? ? 以下:

概述

? ? ? ? 1.基礎

? ? ? ? 2.代碼演示

? ? ? ? 3.練習

????????4.分析題

1.基礎

一、線程基礎概念

  1. 并發執行原理

    • 通過時間片輪轉實現多任務"并行"效果

    • 實際為CPU快速切換執行不同線程

  2. 線程 vs 進程

    • 線程共享進程地址空間,切換開銷更小

    • 進程擁有獨立資源,隔離性更強


二、線程操作函數

1. 線程創建

int pthread_create(
??? pthread_t *id,?????? // 線程ID存儲地址
??? const pthread_attr_t *attr,? // 屬性(NULL為默認)
??? void *(*callback)(void*),? // 線程函數
??? void *arg?????????? // 傳遞給線程的參數
);

  • 返回值:成功返回0,失敗返回錯誤碼

  • 示例

    pthread_t tid;
    int ret = pthread_create(&tid, NULL, thread_func, NULL);

2. 線程終止

void pthread_exit(void *retval);? // 線程主動退出

  • 注意

    • exit()不同,僅終止當前線程

    • retval可被其他線程通過pthread_join()獲取

3. 線程回收

int pthread_join(pthread_t id, void **retval);

  • 功能:阻塞調用線程,直到目標線程結束

  • 參數

    • id:要等待的線程ID

    • retval:接收線程返回值(二級指針)


三、線程控制

1. 線程屬性管理
函數功能
pthread_self()獲取當前線程ID
pthread_detach(id)設置線程為分離態(不可join)
pthread_cancel(id)向線程發送取消請求
2. 取消狀態控制

// 設置取消狀態

// 設置取消類型?
pthread_setcanceltype(
??? PTHREAD_CANCEL_DEFERRED,? // 延遲取消(默認)
??? PTHREAD_CANCEL_ASYNCHRONOUS, // 立即取消
??? NULL
);

  • 延遲取消:只在取消點(如sleep(),?printf())響應取消請求

  • 立即取消:隨時可能被終止(危險)


四、關鍵示例

1. 基礎線程示例

void* print_msg(void *arg) {
??? printf("Thread ID: %lu\n", pthread_self());
??? pthread_exit(NULL);
}

int main() {
??? pthread_t tid;
??? pthread_create(&tid, NULL, print_msg, NULL);
??? pthread_join(tid, NULL);
??? return 0;
}

2. 取消請求處理

void* worker(void *arg) {
??? pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
??? pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

??? while(1) {
??????? printf("Working...\n");
??????? sleep(1);? // 取消點
??? }
??? return NULL;
}


五、注意事項

  1. 分離態線程

    • 設置pthread_detach()后:

      • 不能調用pthread_join()

      • 線程結束后自動釋放資源

  2. 線程安全

    • 共享數據需通過互斥鎖(pthread_mutex_t)保護

    • 避免使用全局變量

  3. 錯誤處理

    • 所有pthread函數返回0表示成功,非0為錯誤碼

    • 建議用strerror(errno)輸出錯誤信息

2.代碼演示

2.1 pthread_create

#include <IO_head.h>
//分支線程
void* callback(void* arg){while(1){printf("division\n");sleep(1);}return NULL;
}int main(int argc,const char* argv[]){pthread_t thread_id;if(pthread_create(&thread_id, NULL, callback, NULL)!=0){printf("error\n");}else{printf("create succeeded\n");}//主線程while(1){printf("main\n");sleep(1);}return 0;
}
ubuntu@ubuntu:~/IO/class3$ cd ~/IO/class4
ubuntu@ubuntu:~/IO/class4$ ./05_thread 
create succeeded
main
division
main
division
main
division

2.2

#include <IO_head.h>
//分支線程
void* callback(void* arg){static int a =200;//important*(int**)arg = &a;return NULL;
}int main(int argc,const char* argv[]){pthread_t thread_id;int* p = NULL;if(pthread_create(&thread_id, NULL, callback, &p)!=0){printf("error\n");}else{printf("create succeeded\n");}//主線程sleep(1);printf("%d\n",*p);return 0;
}
ubuntu@ubuntu:~/IO/class4$ ./06_pointer 
create succeeded
200

2.3

#include <IO_head.h>
//分支線程
void* callback(void* arg){//分支線程idprintf("division thread id = %ld\n", pthread_self());static int num =200;//importantpthread_exit(&num);return NULL;
}int main(int argc,const char* argv[]){pthread_t thread_id;if(pthread_create(&thread_id, NULL, callback, NULL)!=0){printf("error\n");}else{printf("create succeeded\n");}//主線程//主線程idprintf("main thread id = %ld\n", pthread_self());int* p = NULL;pthread_join(thread_id,(void**)&p);printf("main thread:num = %d\n",*p);return 0;
}
ubuntu@ubuntu:~/IO/class4$ ./07_self_exit_join 
create succeeded
main thread id = 139733924939584
division thread id = 139733924935424
main thread:num = 200

3.練習

分段拷貝

#include <IO_head.h>typedef struct message{int ori_des;int new_des;int len;
}message;void RD_WR(int start, int end, int ori_des, int new_des){lseek(ori_des, start, SEEK_SET);lseek(new_des, start, SEEK_SET);char buf;for(int i = start; i<end;++i){read(ori_des, &buf, 1);write(new_des, &buf, 1);}printf("copy succeeded\n");
}void* callback(void* arg){message* mes_p = (message*)arg;RD_WR(mes_p->len/2, mes_p->len, mes_p->ori_des, mes_p->new_des);pthread_exit(NULL);return NULL;
}int main(int argc, const char* argv[]){//文件IO:文件描述符int file_ori_des = open("./01_vfork.c",O_RDONLY);int file_new_des = open("./01_new_vfork.c",O_WRONLY|O_CREAT|O_TRUNC,0777);int len = lseek(file_ori_des,0,SEEK_END);message message_next = {.ori_des = file_ori_des,.new_des = file_new_des,.len = len};pthread_t thread_id;if(pthread_create(&thread_id,NULL,callback,&message_next)!=0){printf("error\n");}else{NULL;}pthread_join(thread_id,NULL);RD_WR(0, len/2, file_ori_des, file_new_des);return 0;
}

4.分析題

4.1解讀代碼:

結果:

...process1

...process

4.2

for(int i=0;i<3;i++)
{fork()printf("-")
}

運行14次

結語

? ? ? ? 以上

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

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

相關文章

MySQL JSON數據類型完全指南:從版本演進到企業實踐的深度對話

&#x1f4ca; MySQL JSON數據類型完全指南&#xff1a;從版本演進到企業實踐的深度對話 在當今數據驅動的時代&#xff0c;MySQL作為最受歡迎的關系型數據庫之一&#xff0c;不斷演進以滿足現代應用的需求。JSON數據類型的引入&#xff0c;讓MySQL在保持關系型數據庫優勢的同時…

BI × 餐飲行業 | 以數據應用重塑全鏈路業務增長路徑

在競爭激烈的餐飲行業中&#xff0c;數據已成為企業保持競爭力的關鍵資產。通過深入分析顧客數據&#xff0c;餐飲企業能夠洞察消費者的需求和偏好&#xff0c;從而提供更加精準和個性化的服務。此外&#xff0c;利用數據優化業務管理&#xff0c;降低成本&#xff0c;并提高運…

【學習線路】機器學習線路概述與內容關鍵點說明

文章目錄 零、機器學習的企業價值一、基礎概念1. 機器學習定義2. 學習類型3. 學習范式 二、核心算法與技術1. 監督學習2. 無監督學習3. 模型評估與優化 三、深度學習與神經網絡1. 神經網絡基礎2. 深度學習框架3. 應用場景 四、工具與實踐1. 數據處理2. 模型部署3. 機器學習的生…

Linux 命令:cp

Linux cp 命令詳細教程 cp 是 Linux 系統中最常用的命令之一&#xff0c;用于復制文件或目錄。它可以將源文件/目錄復制到指定的目標位置&#xff0c;支持批量復制、強制覆蓋、保留文件屬性等功能。下面詳細介紹其用法。資料已經分類整理好&#xff1a;https://pan.quark.cn/s…

java分頁插件| MyBatis-Plus分頁 vs PageHelper分頁:全面對比與最佳實踐

MyBatis-Plus分頁 vs PageHelper分頁&#xff1a;全面對比與最佳實踐 一、分頁技術概述 在Java持久層框架中&#xff0c;分頁是高頻使用的功能。主流方案有&#xff1a; MyBatis-Plus分頁&#xff1a;MyBatis增強工具的內置分頁方案PageHelper分頁&#xff1a;獨立的MyBatis…

PROFINET轉MODBUS TCP網關在機械臂通信操作中的應用研究

在特定的汽車零部件生產工廠焊接生產線上&#xff0c;機械臂被應用于焊接作業&#xff0c;其控制體系基于Profinet協議。同時&#xff0c;工廠的自動化控制體系以西門子S7-1200PLC為核心&#xff0c;通過ModbusTCP協議實現數據交換。為實現焊接過程的自動化控制以及生產數據的實…

Mac中如何Chrome禁用更新[update chflags macos]

寫在前面 在 macOS 系統中&#xff0c;系統更新提示的小紅點常常讓人不勝其擾。 尤其是當你希望保持現有系統的穩定性&#xff0c;或因兼容性問題暫不想升級時&#xff0c;這個小紅點就像一個頑固的提醒。 - windowsMac版直接刪除更新程序, 有效 cd ~/Library/Google/Googl…

LoRA使用-多個LoRA

LoRA的風格分類 不用去記它有什么很特別的風格&#xff0c;簡單來說基礎模型就像一個全能畫手&#xff0c;什么都能畫&#xff0c;而LoRA是在某個風格中經過特訓的它的一個分身。使得它更精通該風格。 關于LoR風格分類&#xff1a;提示詞撰寫公式 Checkpoint&LoRA對比 訓…

牛客刷題 — 【排序】[NOIP2012] 國王的游戲(高精度結構體排序)

1.題面&#xff1a;傳送門 2. 思路&#xff1a; 相鄰的兩個大臣的先后順序只會互相影響&#xff0c;并不會影響其他人的金幣數。 假設前 i-1 個人左手上的數乘積為 s 。 ① 若 A 大臣排在B 大臣的前面&#xff0c;則&#xff1a; s 此時的金幣數最大值為 。 ② 若B大臣排…

grpc 和限流Sentinel

基于gRPC的微服務通信模塊技術方案書 1. 總體架構設計 #mermaid-svg-TiN9cudEfW5mCWHm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiN9cudEfW5mCWHm .error-icon{fill:#552222;}#mermaid-svg-TiN9cudEfW5mCWHm…

經典灰狼算法+編碼器+雙向長短期記憶神經網絡,GWO-Transformer-BiLSTM多變量回歸預測,作者:機器學習之心!

經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#xff1a;機器學習之心&#xff01; 目錄 經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#…

VGG Image Annotator (VIA):一款免費的數據標注軟件介紹與使用

VGG Image Annotator (VIA)&#xff1a;一款免費的數據標注軟件介紹與使用 在計算機視覺領域&#xff0c;數據標注是訓練機器學習模型的基礎步驟之一&#xff0c;而標注工具的選擇直接影響標注的效率和準確性。眾多標注工具中&#xff0c;VGG Image Annotator (VIA) 是一個開源…

CSS實現百分比水柱圖

背景 在echarts沒發現有可以直接使用的展示百分比的柱形圖,只好自己封裝一個組件使用 實現思路 一、圖形拆解 要實現的組件是一個 可配置的圓柱形液柱圖組件&#xff0c;常用于展示比例進度&#xff0c;比如任務完成度、指標達成率等。把圖拆成最小單元然后拼接起來&#x…

詳解 rzsz 工具:Windows 與 Linux 文件傳輸

&#xff08;Linux之軟件包管理器&#xff08;CentOS系統&#xff09; —— yum-CSDN博客&#xff09;rzsz工具之前我在這篇文章中介紹過&#xff0c;現在重新詳細介紹一下該工具。rzsz 是一個用于在 Windows 和 Linux 系統之間傳輸文件的工具集&#xff0c;通常通過終端模擬器…

網絡編程1(UDP)

網絡編程套接字&#xff08;socket api&#xff09; 了解了網絡的一些概念&#xff0c;接下來就要進行網絡中的跨主機通信&#xff0c;了解網絡中的一些API&#xff0c;這里談到的API都是針對傳輸層進行的&#xff0c;這是因為我們編寫的代碼是在應用層&#xff0c;而傳輸層就…

【電機】定點線性映射

這是一個定點數線性映射的問題&#xff0c;通常用于將浮點型的物理量&#xff08;如速度、位置、扭矩&#xff09;轉換為嵌入式系統中使用的整型數據格式&#xff0c;便于通過 CAN 總線或其它通信協議發送給電機控制器。 我們來逐步解析這個過程&#xff0c;并以“速度”為例說…

Spring Cloud 微服務(遠程調用與熔斷機制深度解析)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;服務之間的遠程調用是構建分布式系統的核心環節。然而&#xff0c;隨著服務數量的增加和網絡復雜度的提升&#xff0c;調用失敗、延遲高、異常等問題變得越來越頻繁。 為此&#xff0c;Spring Cloud 提供了強大的遠程調用組件 …

electron-vite 抽離config.js

1、將config.js 放到resources下的config目錄下 module.exports {url: http://192.168.1.17:8000,wsUrl: ws://192.168.1.17:8000, }2、在preload.js 暴露讀取API src/preload/index.js(或你的preload入口) const fs require(fs); const path require(path);function getCo…

MySQL Undo Log 深度解析:事務回滾與MVCC的核心功臣

引言 作為MySQL的“數據后悔藥”和“歷史版本檔案館”&#xff0c;Undo Log&#xff08;回滾日志&#xff09;在事務處理和并發控制中扮演著至關重要的角色。今天咱們就從底層原理出發&#xff0c;結合實際場景&#xff0c;把Undo Log的“里里外外”說個明白&#xff01; 一、…

gin如何返回html

? 方法一&#xff1a;直接返回 HTML 字符串 這種方式適合簡單場景&#xff0c;比如返回一段固定的 HTML 內容。 package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/html", func(c *gin.Context) {htmlContent : <…