受到保護的作業被稱為受保護作業。受保護作業的重要程度足以需要施行互斥。受保護物件擁有至少一個受保護作業。
實作受保護物件的方法是設定互斥旗標,如此每個明確設定為受保護的作業,會在作業開始時鎖定互斥旗標,並在作業結束時釋放它。
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);
}