受保護物件

受保護物件將數個作用中物件或作業共用的資料加以封裝。這些物件沒有自己的執行緒,但是可以同步化來自不同執行緒的呼叫。

受到保護的作業被稱為受保護作業。受保護作業的重要程度足以需要施行互斥。受保護物件擁有至少一個受保護作業。

實作受保護物件的方法是設定互斥旗標,如此每個明確設定為受保護的作業,會在作業開始時鎖定互斥旗標,並在作業結束時釋放它。

RiCMonitor 成員會新增至受保護物件的結構。例如:

typedef struct A A;
struct A {
    RiCMonitor ric_monitor;
    /* other members of A */
};

RiCMonitor 是在 IBM® Rational® Rhapsody® 架構中定義的監視類型。

ric_monitor 子物件僅用於此物件中加上受保護標籤的作業。您可以使用 CG::Operation::Concurrency 內容將作業加上受保護的標籤。

受保護作業是在封套作業內受到保護,封套作業負責保護。產生受保護作業作為專用作業如下:

例如,針對物件 B 的受保護作業 increase() 產生兩個函數:

在物件的規格檔案中產生封套作業宣告:

int B_increase(B* const me, int i);

封套作業 increase() 取得 ric_monitor 物件鎖定、呼叫受保護作業,最後釋放該鎖定:

int B_increase(B* const me, int i) {
    int wrapper_return_value;
    RIC_OPERATION_LOCK(&me->ric_monitor);
    wrapper_return_value = B_increase_guarded(me, i);
    RIC_OPERATION_FREE(&me->ric_monitor);
    return wrapper_return_value;
}

一旦封套函數取得鎖定,受保護作業即受到保護且能夠執行其重要作業,直到鎖定解除之前都不能被其他物件存取。

static int B_increase_guarded(B* const me, int i) {
    {
        /*#[ operation increase(int) */
        return i++;
        /*#]*/
    }
}

同樣地,受保護物件的 cleanup 作業會產生至封套作業及執行清理的受保護作業。例如,受保護物件 B 的清理首先鎖定 B,然後呼叫 cleanup_guarded() 才會執行實際的清理:

void B_Cleanup(B* const me) {
    RIC_OPERATION_LOCK(&me->ric_monitor);
    B_Cleanup_guarded(me);
}
void B_Cleanup_guarded(B* const me) {
    RiCMonitor_cleanup(&me->ric_monitor);
}

您也可以直接使用 lockfree 巨集,以避免封套作業所需的額外支援。


意見回饋