函式可重入和可過載

2021-06-17 23:42:51 字數 2462 閱讀 1890

可重入函式

可重入函式主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。

可重入函式也可以這樣理解,重入即表示重複進入,首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境(包括static),這樣的函式就是purecode(純**)可重入,可以允許有該函式的多個副本在執行,由於它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問全域性變數(包括static),一定要注意實施互斥手段。可重入函式在並行執行環境中非常重要,但是一般要為訪問全域性變數付出一些效能代價。

滿足下列條件的函式多數是不可重入的:

1) 函式體內使用了靜態的資料結構;

2) 函式體內呼叫了malloc()或者free()函式;

3) 函式體內呼叫了標準i/o函式。

下面舉例加以說明。

可重入函式

void strcpy(char *lpszdest, char *lpszsrc)

不可重入函式1

char ctemp;//全域性變數

void swapchar1(char *lpcx, char *lpcy)

編寫可重入的函式?

在函式體內不訪問那些全域性變數,不使用靜態區域性變數,堅持只使用區域性變數,寫出的函式就將是可重入的。如果必須訪問全域性變數,記住利用互斥訊號量來保護全域性變數。

將乙個不可重入的函式改寫成可重入的函式?

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。

1) 不要使用全域性變數。因為別的**很可能覆蓋這些變數值。

2) 在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/退出核心」。

3) 不能呼叫其它任何不可重入的函式。

4) 謹慎使用堆疊。最好先在使用前先os_enter_kernal。

堆疊操作涉及記憶體分配,稍不留神就會造成益出導致覆蓋其他任務的資料,所以,請謹慎使用堆疊!最好別用!很多黑客程式就利用了這一點以便系統執行非法**從而輕鬆獲得系統控制權。還有一些規則,總之,時刻記住一句話:保證中斷是安全的!

過載函式

定義過載函式是函式的一種特殊情況,為方便使用,c++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。

兩個過載函式必須在下列乙個或兩個方面有所區別:

1.、函式有不同引數。

2、函式有不同引數型別,

c++的這種程式設計機制給程式設計者極大的方便,不需要為功能相似、引數不同的函式選用不同的函式名,也增強了程式的可讀性。

c++運算子過載的相關規定如下:

(1)不能改變運算子的優先順序;

(2)不能改變運算子的結合型;

(3)預設引數不能和過載的運算子一起使用;

(4)不能改變運算子的運算元的個數;

(5)不能建立新的運算子,只有已有運算子可以被過載;

(6)運算子作用於c++內部提供的資料型別時,原來含義保持不變。

過載函式(overloaded function)是c++支援的一種特殊函式,c++編譯器對函式過載的判斷更是c++語言中最複雜的內容之一

過載函式的定義:在相同的宣告域中的函式名相同的,而參數列不同的,即通過函式的參數列而唯一標識並且來區分函式的一種特殊的函式。

函式為什麼要過載呢?何時應該選擇函式過載(function overloading)?

函式的過載其實就是「一物多用」的思想(這裡指的「物」是「函式名」),其實不僅是函式可以過載,運算子也是可以過載的。

例如:運算子「<<」和「>>」既可以作為移位運算子,有可以作為輸出流中的插入運算子和輸入流中的提取運算子。

當將要定義一組函式,使它們執行一系列的操作,但是它們是應用在不同的引數型別上的。此時我們可以選擇過載函式。

例如: int z_x_max (int,int); //返回兩個整數的最大值;

int ve_max (const vector &); //返回vector容器中的最大值;

int matrix_max (const matrix &); //返回matrix引用的最大值;

上面的三個函式都可以大概地說成判斷一組數中的最大值,對於函式的使用者來說,他們並不關心函式定義的細節,也就是說他們不關心判斷兩個整數的大小和判斷陣列(vector容器)數的大小應該使用不同的函式,而對於程式的設計者來說這可是不得不想到的。程式設計師必須記住並查詢每個函式名。而函式的過載把程式設計師從這種問題的複雜性中解放了出來,c++提供了這種支援。

可重入函式 可重入核心

可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...

可重入核心 可重入函式

可重入核心在ulk 深入理解linux核心 中的定義是指若干個程序可以同時在核心態下執行,也就是說多個程序可以在核心態下併發執行核心 在單處理器上,只能實現 微觀上的序列,巨集觀上的並行,即任意時刻,只有乙個進 正執行,其他程序處於阻塞或者等待狀態。這裡的可重入,是指可以多個程序進入核心,並不是重複...

可重入和不可重入函式

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。1 不要使用全域性變數。因為別的 很可能覆蓋這些變數值。2 在和硬體發生互動的時候,切記執行類似disinterrupt 之類的操作,就是關閉硬體中斷。完成互動記得...