1. 程式人生 > 實用技巧 >可重入函式(Reentrancy)和執行緒安全函式(Thread-Safety)

可重入函式(Reentrancy)和執行緒安全函式(Thread-Safety)

執行緒安全函式:
它可以被多執行緒同時呼叫,即使使用共享資料,也可以。因為共享的資料在呼叫時已經做了序列化處理。

可重入函式:
一個可重入函式可以被多執行緒同時呼叫,前提時併發呼叫時必須是使用自己的資料。

因此,執行緒安全函式始終是可重入的,但可重入函式並非始終是執行緒安全的。

如果可以從多個執行緒安全地呼叫其成員函式,則該類稱為可重入的,只要每個執行緒使用該類的不同例項即可。 如果可以從多個執行緒安全地呼叫其成員函式,則該類是執行緒安全的,即使所有執行緒都使用該類的相同例項也是如此。

可重入(Reentrancy)

c++類大多都是可重入的,這是因為他們訪問他們自己的成員變數。任何執行緒調都可以呼叫一個例項的成員函式,沒有其它執行緒同時呼叫同一個例項的成員函式。

例如以下的類是一個可重入的類

class Counter
{
public:
    Counter() { n = 0; }

    void increment() { ++n; }
    void decrement() { --n; }
    int value() const { return n; }

private:
    int n;
};

這個類不是執行緒安全的,因為多個執行緒可以試圖修改同一個例項變數n,最後會得到一個意料之外的結果。因為++和--操作符不是原子操作。

執行緒安全(Thread-Safe)

class Counter
{
public:
    Counter() { n = 0; }

    void increment() { 
QMutexLocker
locker(&mutex); ++n; } void decrement() { QMutexLocker locker(&mutex); --n; } int value() const { QMutexLocker locker(&mutex); return n; } private: mutable QMutex mutex; int n; };

使用Qt時要注意:

許多Qt的類是可重入的類,而不是執行緒安全的。例如,QString是一個可重入的類而不是一個執行緒安全的類,你可以多執行緒安全的訪問不同的QString但是不能一個執行緒同時訪問同一個QString,如果非要這樣做,一定要用Mutex來保護。

一些QT的類和函式是執行緒安全的, 他們主要是一些執行緒相關的類(比如QMutex)或者是一些基礎函式例如(QCoreApplication:postEvent)

注意:多執行緒領域的術語尚未標準化,POSIX使用reentrant和thread-safe,有些時候與C API不同。當將其他面向物件的C ++類庫與Qt一起使用時,請確保已理解這些定義