線程創建-結束-回收 教程

ps aux -L 查看線程信息 且顯示進程狀態

?

?

使用進程的缺點: 進程切換 系統開銷較大

開銷大的原因 :切換時需要頻繁刷新 cache(類似于緩沖區) 和TLB

?

linux不區分線程 進程

?

線程其實也屬于進程 只不過是特殊的進程 是一種可以共享地址空間的進程

?

使用線程的優點:同一進程的線程會共享相同的地址空間

當使用多線程時 會大大提高任務切換的效率

避免多次刷新cache和TLB

通過全局變量即可交換數據 使通信變得非常容易

缺點:

多個線程訪問共享資源時 需要同步或互斥機制

?

一個進程中的線程可共享的資源:

?

可執行指令

靜態數據

進程中打開的文件描述符

當前工作目錄

用戶D

用戶組ID

?

每個線程私有的資源:

線程ID

pc(程序計數器)和相關寄存器

堆棧

錯誤號

優先級

執行狀態和屬性

?

?????????????????????????????????????????????????????????????? 創建線程

?

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);

成功返回0 失敗返回錯誤碼

thread 線程對象

attr 指定線程屬性 NULL代表默認屬性

routine 線程執行函數 (參數是一個函數指針)

arg 傳遞給routine這個函數的參數

?

?????????????????????????????????????????? 線程回收

?

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval)

?

成功返回0 失敗返回錯誤碼

thread 要回收的線程對象 如果線程未結束 調用線程會阻塞 直到thread結束

*retval 接受線程的返回值

?

???????????????????????????????????????????????????????????????? 結束線程

?

#include <pthread.h>

void pthread_exit(void *retval)

?

如果用exit()會結束所有線程

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

retval需要被設定成全局變量才能被其他進程操作 否則只能被當前進程操作

?

Ps:

char message[32] = {"hello world!"}

void *thread_func(void *arg); //創建進程參數的實現函數

?

int main()

{

pthread_t a_thread;

void *result;

?

if(pthread_create(&a_thread, NULL, thread_func), NULL) != 0)

{

printf("fail to pthread_creat");

exit(-1);

}

?

pthread_join(&a_thread, &result);

printf("result is %s\n", result);

printf("message is %s\n", message);

return 0;

}

?

//重寫實現函數

void thread_func(void *arg)

{

sleep(1);

strcpy(message, "marked by thread");

pthread_exit("thank you for waiting for me");

}

?

運行命令:

gcc -o test test.c -lpthread

./test

打印結果:

thank you to waiting for me

marked by thread

?

?

?

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

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

相關文章

【匯編語言】匯編實驗IDE(集成開發環境):RadASM的安裝和使用說明

0 前言 本文適合8086CPU的指令集。 對于重要的專業基礎課程&#xff0c;匯編語言&#xff0c;做實驗是必不可少的&#xff0c;但是由于匯編語言本身的缺陷&#xff0c;現代計算機并不能直接運行匯編語言程序&#xff0c;因此&#xff0c;一般老師會要求我們 使用虛擬機&…

【匯編語言】理解8086CPU中,不同類型的寄存器和匯編指令規則的聯系(會繼續更新)

0 前言 你是否因為匯編指令繁雜的規則而苦惱呢&#xff1f;作者本人也很煩&#xff0c;因為往往教材中只告訴我們規則&#xff0c;卻不告訴我們為什么&#xff0c;沒有原因就直接記憶&#xff0c;負擔太大&#xff0c;后期靈活運用也增添阻力&#xff0c;因此&#xff0c;我經…

System V IPC之信號燈

信號燈也叫信號量 用于進程/線程同步或互斥的機制 信號燈的類型 1.Posix 無名信號燈 2.Posix 有名信號燈 3.System V 信號燈 信號燈的含義 計數信號燈&#xff08;1和2都是&#xff09; System V信號燈是一個或多個計數信號燈的集合&#xff08;可操作集合中的多個信號燈&…

【VS 2017 C語言 匯編語言】如何使用VS 2017,通過反匯編查看C語言代碼對應的32位x86匯編語言 VS 2017單步調試的使用

0 前言 本文適用于VS的大多數版本&#xff0c;本文以VS 2017為例進行講解。 1 編輯C語言代碼 首先&#xff0c;在VS編譯器中&#xff0c;創建項目&#xff0c;敲一段C語言代碼&#xff0c;這個過程不解釋了&#xff0c;如果不會請百度。 #include <stdio.h> #include…

System V IPC之共享內存

共享內存是一種最為高效的進程間通信方式&#xff0c;進程可以直接讀寫內存&#xff0c; 而不需要任何數據的拷貝 共享內存在內核空間創建&#xff0c; 可以被進程映射到用戶空間訪問 由于多個進程可同時訪問共享內存 &#xff0c; 因此需要同步和互斥機制配合使用 共享內存的使…

【匯編語言】結合C語言,使用VS 2017調試模式下的反匯編工具學習32位x86匯編指令

0 前言 簡要說明x86系列指令集的整體概況與變化。 我給到你補充學習內容&#xff1a;使用VS學習匯編語言的教程 1 8086CPU到現代CPU的變化 做一些了解即可&#xff0c;不是絕對的&#xff0c;取決于設計工藝以及用途&#xff0c;不同計算機不一樣也正常。 1.1 CPU位數與地…

System V IPC之消息隊列

消息隊列由消息隊列id來唯一標識 消息隊列就是一個消息的列表 用戶可以在消息隊列中添加消息 讀取消息 消息隊列可以按照類型來發送和接收消息 消息隊列使用步驟 打開/創建消息隊列 msgget 向消息隊列發送消息 msgsnd 從消息隊列接收消息 msgrcv 控制消息隊列 msgctl 創建/打開…

【匯編語言】學習源頭知識:XLAT指令的本質(待更新)

0 前言 帶你理解XLAT指令的本質. 我想讓你清楚的是&#xff0c;XLAT指令 本質就是數據的傳送&#xff1a;本質就是完成mov指令的傳送功能&#xff0c;只不過源操作數的尋址方式是[bxal]&#xff0c;目標操作數是al表象是數據的轉換&#xff1a;例如將十六進制轉換為ASCII字符…

進程間通信————信號

信號 信號是在軟件層次上對中斷機制的一直模擬&#xff0c;是一種異步通信方式 linux內核通過信號通知用戶進程&#xff0c; 不同的信號類型代表不同的事件 進程對信號有不同的響應方式 缺省方式 忽略信號 捕捉信號 SIGKILL和SIGSTOP這兩個信號量 級別很高 只能執行默認操作…

【匯編語言】清華大學學堂在線《匯編語言程序設計》課程學習筆記

0 前言 全是基于x86系列處理器 1 寄存器與存儲器的區別 2 匯編程序員眼中的系統結構 指令寄存器 PC&#xff08;Program Counter&#xff09; 指向下一條指令的地址 16位 CS:IP32位 EIP64位 RIP 寄存器與寄存器堆&#xff08;Registers&#xff09; 在處理器內部以名字方…

進程間通信————無名管道

無名管道 只能用于具有親緣關系的進程之間的通信 單工的通信模式 具有固定的讀端和寫端 無名管道創建時會返回兩個文件描述符 分別用于讀寫管道 只能用于親屬關系之間 創建無名管道 #include <unistd.h> int pipe(int pfd[2]) 成功返回0 失敗返回EOF pfd包含兩個元素的…

什么是計算機思維?2個簡單表達式讓你理解!

0 前言 本文以十進制整數為例&#xff0c;使用2個最簡單的表達式char a -20;和char c a b;,為你深入淺出地講解計算機思維&#xff0c;力求將抽象的計算機思維具象化講解&#xff0c;同時&#xff0c;我將為你描述一個宏大的計算機世界的藍圖。 計算機思維與核心思想概要&a…

進程間通信————有名管道

有名管道 特點&#xff1a; 對應管道文件 可用于任意進程之間進行通信 打開管道時 可指定讀寫方式 通過文件I/O操作 內容存放在內存中 當讀端和寫端都不存在 管道內容自動釋放 當讀端和寫端只存在一個 將會無法打開管道文件 管道文件大小永遠為0 因為管道中的內容保存在內…

【匯編語言】8086匯編的loop循環與[bx]尋址(王爽第五章5.5節學習筆記)

計算FFFF:0 ~ FFFF:B單元中數據的和&#xff0c;結果存儲到dx中 1 分析與解決 內存單元&#xff1a;字節型數據目標寄存器&#xff1a;dx&#xff0c;字型寄存器&#xff0c;不匹配數據范圍&#xff1a;dx不會超&#xff0c;但是dl會超&#xff0c;因此必須用dx將字節型數據&a…

Linux下數據庫(sqlite3)學習筆記

sqlite3 數據庫安裝 1. 本地安裝 sudo dpkg -i *.deb 2.在線安裝 sudo apt-get install sqlite3 3.使用壓縮包解壓 壓縮包下載路徑&#xff1a;鏈接&#xff1a;https://pan.baidu.com/s/1xHLZGObQODUGBReNEi3KKQ 提取碼&#xff1a;zjqv SQLITE3 基本命令 兩種命令 1.以…

【匯編語言】8086、x86-32和C語言【賦值語句 和 數組】的對比學習(王爽學習筆記:5.8段前綴的使用)

0 前言 這里給出兩種思路&#xff0c;都比王爽老師書上的做法要簡單高效&#xff0c;事實上&#xff0c;理解指令的本質&#xff0c;就能達到靈活應用&#xff0c;這樣才能打破規則 題目&#xff1a;將內存ffff:0 - ffff:b的數據&#xff0c;復制到內存ffff:10 - ffff:1b中 備…

signal------SIGCHLD

因為筆者之前的文章里面有錯誤&#xff0c;今天發現&#xff0c;立馬做個修改。在下面我的一段關于sigchld信號相對于直接調用wait函數的好處時&#xff0c;我說調用wait函數要一直檢測子進程是否執行完其實是錯誤的&#xff0c; wait是阻塞函數&#xff0c;當主進程調用wait函…

為什么要學習匯編語言?如何正確學習匯編語言?

匯編語言是計算機系統結構的接口&#xff0c;它介于軟硬件之間&#xff0c;學習的時候&#xff0c;必須結合軟件和硬件來學習。 1 向上結合高級語言 學習匯編語言的時候&#xff0c;不可孤立學習匯編語言&#xff0c;當今時代很少之間用到匯編語言編程&#xff0c;但是使用匯…

數據庫Sqlite3

sqlite3 數據庫安裝 1. 本地安裝 sudo dpkg -i *.deb 2.在線安裝 sudo apt-get install sqlite3 SQLITE3 基本命令 兩種命令 1.以 . 開頭的稱之為系統命令 .help 幫助 .quit 退出 .exit 退出 .databases 查看打開的數據庫&#xff08;顯示數據庫的名字和路徑&#xff…

【匯編語言】(王爽)實驗4解答

題目1 編程&#xff1a;向內存0:200 - 0:23F 中存放數據 0 - 3FH ; 向內存 0:200 ~ 0:23f 寫入數據0~3fH【字節型數據】 assume cs:code code segmentstart:mov ax,0mov ds,axmov bx,0200H ; 偏移地址mov al,0 ; 數據mov cx,03fH1H ; 0 ~ 3FH 共 (3F 1)Hs:mov [bx],alinc b…