網路程式設計(34)linux中的多執行緒

2021-12-29 19:50:07 字數 2346 閱讀 6208

1、建立子程序時,需要完全複製父程序的記憶體,造成很大的效能開銷。

2、由於各個程序之間不屬於同一片記憶體,程序間通訊需要特殊的ipc技術

3、cpu在執行程序的**時,需要進行上下文切換(將原程序的上下文資料從記憶體拷貝出去備份,然後拷貝進新程序的上下文到記憶體),而且這種切換的頻率很高,每秒鐘上百次甚至上千次,造成了很大的效能開銷。

多執行緒的提出,就是為了最大限度的減少上述問題,程序可以理解為構成作業系統的程式執行流,而執行緒可以理解為構成程序的程式執行流,有了多執行緒:

1、建立子執行緒時不必完全的賦值程序的記憶體

2、執行緒間共享資料區和堆區,不必採用特殊的ipc技術進行執行緒間的通訊

3、最主要一點,執行緒間進行在切換時不需要進行上下文的切換。

下面,給出linux中建立執行緒的函式原型:

#include

int pthread_create(pthread_t * restrict thread, const pthread_attr_t * restrict attr,

void *(*start_routine) (void *), void * restrict arg);

thread -- 用來儲存建立的程序的程序id。

attr -- 用來設定程序的屬性,通常情況下傳入null即可

start_routine -- 執行緒主函式的函式指標,每個執行緒都有自己的main函式,這裡的start_routine就是執行緒main函式的函式指標。

arg -- 傳遞給執行緒的引數的指標

大家注意到了,在thread等引數的前面都有乙個restrict關鍵字進行修飾,restrict的意思是告訴編譯器,該指標或者引用所指的變數只能由該指標或者引用進行修改,無法通過其他方式進行修改。下面,我們先研究下restrict的用法和作用,首先先看下面的例子:

#include

int main()

這是我剛剛接觸到restrict時,想要驗證restrict功能的**,以我最初的理解,restrict既然是告訴編譯器,該指標指向的變數只能通過該指標進行修改,那麼在**中我通過pi1進行修改i的值時,編譯器一定會報錯,

但是結果是不是這樣呢,請看下面的執行過程(編譯時需要加上 -std=c99的編譯選項,因為從c99開始才支援對restrict的支援):

[hyman@hyman-pc retrictts]$ gcc restrictts.c -std=c99

[hyman@hyman-pc retrictts]$ ./a.out

i=1程式非但沒有報錯,反而得到了正確的執行結果?這是怎麼回事?

原來restrict只是針對編譯器的乙個優化策略,它告訴編譯器,因為沒有別的指標指向該變數,在編譯階段就計算出該變數的值然後在所有使用該變數的地方進行**合併,比如有兩段**:

*pi+=2;

*pi+=5;

將會被合併為

pi+=7

至於是不是針對只有該指標指向這個變數這個需要程式設計師自己去控制,就像這是乙個規則,但是尊不遵守規則,那是你自己的事情了。

簡單介紹了下restrict關鍵字,我們繼續進行多執行緒的討論。先舉例介紹多執行緒的使用方法:

#include

#include

#include

void pthread_main(int* pmax)

{int i=0;

for(i=0;i

第17行,我們利用pthread_create()函式建立了乙個執行緒,程序函式為pthread_main,函式引數通過pthread_create中最後乙個引數進行傳遞,**程函式中列印字串hild thread called ...,總的列印次數按照傳過來的執行緒引數決定。

第22行,程式sleep了11秒,主要目的是為了等待子執行緒執行結束,給子執行緒的執行準備充足的時間。

執行結果如下(請注意編譯時,需要新增-lpthread選項):

[hyman@hyman-pc retrictts]$ gcc restrictts.c -lpthread

[hyman@hyman-pc retrictts]$ ./a.out

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

child thread called ...

github位置:

轉殖本專案:

3 4 Linux中附加許可權 粘滯位許可權

1 只有可執行二進位制程式才能設定suid許可權 2 命令執行者要對該程式擁有x 執行 許可權 如果當前檔案沒有執行許可權,著會出現大s許可權,大s許可權是無效的,s s x,s才是超級許可權。3 命令執行者在執行該程式時獲得該程式檔案屬主身份 4 setuid許可權只在程式執行過程中有效 5 設定...

網路程式設計 Linux多播簡單實現

在測試多時先確定測試的介面 網絡卡 是否已經開啟多播功能,如下 圖.1其中running multicast表示開啟了多播功能,可用ifconfig命令開啟 多播資料傳送端 include include include include include include include include...

Windows Forms 中實現安全的多執行緒

前言 首席執行官任務操作 許多種類的應用程式都需要長時間操作,比如 執行乙個列印任務,請求乙個 web service 呼叫等。使用者在這種情況下一般會去轉移做其他事情來等待任務的完成,同時還希望隨時可以監控任務的執行進度。下面的 片斷示例了當長任務執行時使用者介面是如何被更新的。顯示進度條 voi...