Linux下的多執行緒概念

2021-08-18 08:13:09 字數 1580 閱讀 2020

執行緒是程序內部的執行單位,乙個執行緒即使程序內的乙個執行流。對於執行緒,每個系統的實現可能不一樣,在linux中,執行緒也叫輕量級程序,作業系統沒有把執行緒與程序明顯的區分開,它們的資料結構是一樣的,都是task_struct。在程序資源分配時,以程序為單位程序分配;而在排程時,則以執行緒為單位。可以這樣理解,**最初被載入進記憶體中時,系統會給這些**分配一系列資源,這樣就建立了乙個「程序」,而程序內部可能會同時實現不同的功能,這就需要程序內部同時有各不相同的數個執行流在執行,這些執行流就是執行緒。在我們剛開始學習寫**時,寫出的程式基本都只有乙個執行流,即所有**按先後順序依次執行,我們稱為單執行緒的程序;而有的程式出於某些需要,會有多個執行流,即某些**可能同時執行,這就是多執行緒的程序。

在乙個單執行緒程序中,程序的模型是這樣的:

而多執行緒程序中,程序的模型是這樣的:

那麼為什麼有了程序後還要出現執行緒呢?這得說說執行緒的優點:

1、建立乙個新執行緒的代價要比建立乙個新程序的代價要小得多。

2、與程序間的切換相比,執行緒間的切換需要系統做的工作要少很多。

3、執行緒占用的資源比程序要少很多。

4、能充分利用多處理器的可並行數量。

5、在等待慢速i/o操作結束的同時,程式可以做其他工作。

6、計算密集型應用,為了能在多處理器上執行,將計算分解到多個執行緒中實現。

7、i/o密集型應用,為了提高效能,將i/o重疊,執行緒可以同時等待不同的i/o操作。

當然,執行緒也有缺點:

1、效能損失。

2、健壯性降低。

3、缺乏訪問控制。

4、程式設計難度提高。

#include 

#include

#include

#include

#include

#define _gnu_source

void *thread_run(void *arg)

int main(void)

執行程式,使用指令 ps -elf |head -1 && ps -elf |grep a.out |grep -v grep 來觀察:

可以看到,兩個執行緒的pid與ppid相同,而執行緒id即lwp不同。兩個執行緒中,第乙個執行緒的lwp與執行緒id—pid相同,第二個不同。通常將執行緒id(lwp)與程序id(pid)相同的執行緒稱為這個執行緒組的組長,task_struct的部分**:

struct task_struct

;

這裡的pid是執行緒id,而tgid,表示thread group id,該值對應使用者層面的程序id。同乙個執行緒組中的執行緒用雙向鍊錶連線。

本文講了關於執行緒的基本概念,下篇文章講述關於執行緒的建立、終止等操作。

Linux下多執行緒的執行緒保護

目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...

多執行緒的概念

多執行緒的好處在於可以提高cpu的利用率 任何乙個程式設計師都不希望自己的程式很多時候沒事可幹,在多執行緒程式中 乙個執行緒必須等待的時候,cpu可以執行其它的執行緒而不是等待,這樣就大大提高了程式的效率。然而我們也必須認識到執行緒本身可能影響系統效能的不利方面,以正確使用執行緒 執行緒也是程式,所...

多執行緒的概念

資料請求 文字資料 其他資料 用多個執行緒完成乙個任務,任務分成多個小模組,每個執行緒去完成各自的模組。執行緒 完成某一任務的程式 塊,可以建立執行緒 停止執行緒 中斷執行緒等操作。型別 主線程 子執行緒 主線程 在應用程式啟動時,隨著程序的建立而產生的執行緒,這個執行緒稱之為主線程。用於引導程式必...