Linux系統上使用C語言創建線程

文章目錄

  • 一、使用C代碼創建線程
    • 示例
    • API
  • 二、線程的相關知識
    • 2.1 線程 與 進程 的關系
    • 2.2 使用線程的理由

一、使用C代碼創建線程

使用pthread_create函數創建線程。

示例

示例:創建一個線程,其作用就是打印線程ID和傳入參數。

//demo1
#include <stdio.h>
#include <pthread.h>void* fun1(void *arg)
{printf("t1:%ld thread is create\n", (unsigned long)pthread_self());//pthread_self()打印線程IDprintf("t1: %d\n", *((int*)arg));//函數執行結束,會默認調用 pthread_exit
}int main()
{//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);int ret;int param = 100;pthread_t t1;//1.創建線程//                       線程屬性 線程函數 線程函數參數ret = pthread_create(&t1, NULL, fun1, (void*)&param);if(ret == 0){printf("main:create t1 success\n");} else {perror("why t1 fail");}printf("main:%ld\n", (unsigned long)pthread_self());//打印主線程ID//2.等待線程pthread_join(t1, NULL);//等待線程結束,防止進程結束,線程還未執行完畢return 0;
}

API

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回:若成功返回0,否則返回錯誤編號

當pthread_create成功則返回0,函數參數:

  1. tidp 指向的內存單元被設置為新創建線程的線程ID。
  2. attr 參數用于定制各種不同的線程屬性,暫可以把它設置為 NULL,以創建默認屬性的線程。(工作中也多用NULL)
  3. 新創建的線程從 start_rtn(函數指針)函數的地址開始運行,該函數只有一個無類型指針參數 arg
  4. 如果需要向 start_rtn 函數傳遞的參數不止一個,那么需要把這些參數放到一個結構中,然后把這個結構的地址作為 arg 參數傳入。

pthread_join函數的作用是等待,效果上看是等待線程的執行過程,只有線程執行完畢,才會繼續執行下去。可以在fun1函數最后添加while1的死循環來驗證:程序不會退出,因為線程一直卡在循環處。感興趣可以多創建一個t2線程來體驗pthread_join函數的作用,一個函數中不帶死循環,一個函數中帶死循環,都使用pthread_join函數進行等待。

二、線程的相關知識

2.1 線程 與 進程 的關系

線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條進程指的是一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并發執行不同的任務。線程包含了表示進程內執行環境必須的信息,其中包括進程中表示線程的 線程ID、一組寄存器值、棧、調度優先級和策略、信號屏蔽字、errno常量以及線程私有數據。進程的所有信息對所有線程都是共享的,包括可執行的程序文本、程序的全局變量和堆內存、棧以及文件描述符。在Unix和類Unix操作系統中線程也被稱為輕量級進程(lightweight process),但輕量級進程更多指的是內核線程(kernel thread),而把用戶線程(user thread)稱為線程。

  • 進程——資源分配的最小單位
  • 線程——程序執行的最小單位

進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其他進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但沒有獨立的地址空間,一個線程死掉就等于整個進程死掉,所以多進程程序比多線程程序健壯,但切換進程時,資源耗費比較大,效率差一些。但對于要求同時進行且又需要共享變量的并發操作,只能使用線程,不能使用進程。

2.2 使用線程的理由

從上面我們知道了進程與線程的區別,其實這些區別也就是我們使用線程的理由。總的來說就是:進程有獨立的地址空間,線程沒有獨立的地址空間(同一進程內的線程共享進程的地址空間)。

使用多線程的理由之一是和進程相比,它是一種非常“節儉”的多任務處理方式。我們知道,在Linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。

使用多線程的理由之二是線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。當然,數據的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數據更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最需要注意的地方。

多線程程序作為一種多任務、并發的工作方式,有以下的優點:

  • 提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time
    consuming)置于一個新的線程,可以避免這種尷尬的情況。
  • 使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上。
  • 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。

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

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

相關文章

cookie和session對http的作用以及區別

HTTP協議本身是無法判斷用戶身份。所以需要cookie或者session。 1、什么是cookie&#xff1f; cookie 是由 Web 服務器保存在用戶瀏覽器上的文件&#xff08; key-value 格式&#xff09;&#xff0c;可以包含用戶相關的信 息。客戶端向服務器發起請求&#xff0c;就提取瀏覽器…

基于串流技術的p2p共享桌面共享方案

研究遠控有一定時間了&#xff0c;但真正落地運用的不多&#xff0c;所以也不太上心&#xff0c;平時也只是自己diy玩玩&#xff0c;遠程共享看看電視劇。 最近生成式ai大火&#xff0c;直接帶動了gpu應用的相關場景&#xff0c;相關場景&#xff0c;但gpu卡又貴&#xff0c;對…

[記錄]-cannot import name ‘prelu‘ from ‘lasagne.layers‘

問題&#xff1a;cannot import name prelu from lasagne.layers 現有版本&#xff1a;lasagne 0.1,需要更新版本&#xff0c;直接pip installLasagne0.2 目前還不行 需要去源碼下載 命令&#xff1a; pip install --upgrade https://github.com/Theano/Theano/archive/mas…

每日一題——LeetCode1556.千位分隔符

方法一 個人方法&#xff1a; 把n轉為字符串&#xff0c;逆序遍歷n&#xff0c;把n的每個元素加入res&#xff0c;每三次加入.&#xff0c;最后將res翻轉再轉為字符串即為符合題目要求的結果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…

LibreOJ 136. 最小瓶頸路 題解 最小生成樹 倍增

題目鏈接&#xff1a;LibreOJ 136. 最小瓶頸路 題目描述&#xff1a; 給定一張無向圖&#xff0c;詢問兩個結點之間的最小瓶頸路。u和v兩個結點之間最小瓶頸路指的是u和v的每條路徑中經過的最大邊權的最小值。 題解&#xff1a; 給出結論&#xff1a;無向圖的最小瓶頸路與其最小…

iptables學習

iptables的4表5鏈的處理流程 一&#xff1a;業務地址請求服務時&#xff0c;首先經過iptables服務&#xff0c;iptables通過校驗規則&#xff0c;通過校驗是否同意業務訪問&#xff0c;規則從上到下&#xff0c;匹配規則都失敗了的話&#xff0c;走默認規則 &#xff08;1&…

202435讀書筆記|《半小時漫畫中國史》——讀點經濟學與歷史,生活更美好,趣味燒腦土地制度、商鞅變法、華麗麗的絲綢之路這里都有

202435讀書筆記|《半小時漫畫中國史》——讀點經濟學與歷史&#xff0c;生活更美好&#xff0c;趣味燒腦土地制度、商鞅變法、華麗麗的絲綢之路這里都有 1. 土地政策、度量衡及稅收2. 商鞅變法3. 西漢經濟4. 西漢鹽鐵大辯論5. 西漢絲綢之路 《半小時漫畫中國史&#xff1a;經濟…

五子棋裁判

描述 在程序設計實踐課上&#xff0c;老師給大家布置下了這樣的實驗任務&#xff1a;編寫一個五子棋應用程序 勝負判定是五子棋程序最核心的部分。給出當前棋盤的狀態&#xff0c;請你完成對五子棋勝負的判定&#xff08;僅考慮當前狀態&#xff0c;不考慮后續落子&#xff0…

Typora快捷鍵設置詳細教程(內附每個步驟詳細截圖)

&#x1f60e; 作者介紹&#xff1a;我是程序員洲洲&#xff0c;一個熱愛寫作的非著名程序員。CSDN全棧優質領域創作者、華為云博客社區云享專家、阿里云博客社區專家博主、前后端開發、人工智能研究生。公粽號&#xff1a;程序員洲洲。 &#x1f388; 本文專欄&#xff1a;本文…

在vue2中使用餅狀圖

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 補充基本的body內容 <div id…

存儲過程基本了解

文章目錄 介紹存儲過程示例1. 目的2. 輸入參數3. 輸出參數4. 執行邏輯5. 返回值6. 示例用法7. 注意事項 存儲過程的關鍵字有哪些簡單實操 介紹 存儲過程是一組預編譯的SQL語句&#xff0c;以及流程控制語句&#xff0c;封裝在數據庫服務器中并可以被重復調用。它們可以接收參數…

5G 網絡建設【華為OD機試-JAVAPythonC++JS】

題目描述 現需要在某城市進行5G網絡建設&#xff0c;已經選取N個地點設置5G基站&#xff0c;編號固定為1到N&#xff0c;接下來需要各個基站之間使用光纖進行連接以確保基站能互聯互通&#xff0c;不同基站之間架設光纖的成本各不相同&#xff0c;且有些節點之間已經存在光纖相…

CentOS7安裝MySQL5.7

查看并卸載系統自帶的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 檢查系統是否安裝過MySQL rpm -qa | grep mysql 檢查有無MySQL用戶組 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 創建MySQL用戶組和用戶 groupadd m…

特斯拉一面算法原題

來自太空的 X 帖子 埃隆馬斯克&#xff08;Elon Musk&#xff09;旗下太空探索技術公司 SpaceX 于 2 月 26 號&#xff0c;從太空往社交平臺 X&#xff08;前身為推特&#xff0c;已被馬斯克全資收購并改名&#xff09;發布帖子。 這是 SpaceX 官號首次通過星鏈來發送 X 帖子&a…

SpringBoot+Vue實戰:打造企業級項目管理神器

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

【YOLO】INT8量化C++版

三、INT8量化 C++ 3.1下載coco128數據集 cd /mnt/workspace/yolov5/data/scripts sh get_coco128.sh3.2 模型準備 #onnx轉simple_onnx pip install onnx-simplifier python -m onnxsim yolov5s.onnx yolov5s-simple.onnx3.3 下載量化代碼庫 git clone https://github.com/W…

水豚鼠標助手 強大的鼠標美化工具

水豚鼠標助手 水豚鼠標助手是一款 鼠標換膚、屏幕畫筆、放大鏡、聚光燈、屏幕放大、倒計時功能的強大屏幕演示工具。 軟件助手獲取 水豚鼠標助手1.0.0 安裝教程 第一步&#xff1a;下載后&#xff0c;雙擊軟件安裝包 第二步&#xff1a;Windows可能會出現提示彈窗&#xff…

【已親測有效】如何徹底刪除nodejs,避免影響安裝新版本

第一步開始菜單搜索uninstall node.js&#xff0c;點擊之后等待刪除&#xff08;刪除node_modules文件夾以及以下這些文件&#xff09; 第二步手動刪除nodejs下載位置的其他文件夾。&#xff08;就是另外自己新建的兩個文件夾node_cache和node_global&#xff09; 到這里其實應…

uniapp實現多行文本溢出超過指定行數 展開 收起

一、組件封裝 <template><view class"multiline"><view class"info"><view :class"{hide:!iSinfo}" :style"!iSinfo?computedStyle:"><view :style"{ color: textColor,fontWeight:fontWeight,font…

網絡安全課程VIP介紹(比同行便宜)

免責聲明 本文發布的工具和腳本&#xff0c;僅用作測試和學習研究&#xff0c;禁止用于商業用途&#xff0c;不能保證其合法性&#xff0c;準確性&#xff0c;完整性和有效性&#xff0c;請根據情況自行判斷。如果任何單位或個人認為該項目的腳本可能涉嫌侵犯其權利&#xff0c…