カウント+ロックを参照する設計構想
1107 ワード
コンカレントシステムを設計する際、例えば、A,B,Cの3つのオブジェクトを更新し、別のビジネス2を削除するビジネス1があるという問題がよくあります.
この2つの異なる業務は、合併すれば問題が発生しやすい.例えば、業務1が半分になった場合、業務2が突然Bを削除すると、業務1に奇妙な異常が生じる可能性がある.
参照カウントは、この問題を解決するために使用できます.Bオブジェクトの構造体に、次のフィールドを入れます.
オブジェクトの参照カウントが0でない限り、オブジェクトが生存し、オブジェクトが存在するトポロジが安定していることを意味します.たとえば、オブジェクトが赤と黒のツリーに配置されている場合、オブジェクトの参照が0でない限り、ビジネスはこのオブジェクトを安心して使用することができ、オブジェクトは常にこの赤と黒のツリーにあると考えられます.
オブジェクトが作成されると、参照数は1になります.ビジネス1がBを更新する前に、Bのポインタを取得する必要がある.この場合、Bの参照カウントは少なくとも1であるため、Bが削除されないことを保証することができる.
業務2は、Bオブジェクトを削除する際にも、まずBのポインタを取得し、1を減算します.1を減算した後、カウントが0の場合、このオブジェクトを参照してflagを無効なオブジェクトに設定し、関連するビジネスを削除します(たとえば、オブジェクトを赤と黒のツリーから削除します).参照カウントが0でない場合、現在他のビジネスがこのオブジェクトを使用していることを示します.この場合、ビジネス2はobj_を設定します.finalコールバック関数とprivateコールバックパラメータ.
ビジネス1はBオブジェクトを使用した後、そのカウントを1に減らします.カウントが0の場合、flagフラグは無効なオブジェクトに設定され、オブジェクトBが無効になっていることを示します.そしてobj_を呼び出すfinalコールバック関数obj_finalは業務2が本当にやりたい削除業務をします.この時、もうオブジェクトBにアクセスできる業務はありません.オブジェクトBは安全に削除できます.
簡単な考えはこうです.
この2つの異なる業務は、合併すれば問題が発生しやすい.例えば、業務1が半分になった場合、業務2が突然Bを削除すると、業務1に奇妙な異常が生じる可能性がある.
参照カウントは、この問題を解決するために使用できます.Bオブジェクトの構造体に、次のフィールドを入れます.
u32_t refcnt; //
spinlock_t lock; //
u8_t flag; // ,
void (*obj_final) (void *private);
void *private;
オブジェクトの参照カウントが0でない限り、オブジェクトが生存し、オブジェクトが存在するトポロジが安定していることを意味します.たとえば、オブジェクトが赤と黒のツリーに配置されている場合、オブジェクトの参照が0でない限り、ビジネスはこのオブジェクトを安心して使用することができ、オブジェクトは常にこの赤と黒のツリーにあると考えられます.
オブジェクトが作成されると、参照数は1になります.ビジネス1がBを更新する前に、Bのポインタを取得する必要がある.この場合、Bの参照カウントは少なくとも1であるため、Bが削除されないことを保証することができる.
業務2は、Bオブジェクトを削除する際にも、まずBのポインタを取得し、1を減算します.1を減算した後、カウントが0の場合、このオブジェクトを参照してflagを無効なオブジェクトに設定し、関連するビジネスを削除します(たとえば、オブジェクトを赤と黒のツリーから削除します).参照カウントが0でない場合、現在他のビジネスがこのオブジェクトを使用していることを示します.この場合、ビジネス2はobj_を設定します.finalコールバック関数とprivateコールバックパラメータ.
ビジネス1はBオブジェクトを使用した後、そのカウントを1に減らします.カウントが0の場合、flagフラグは無効なオブジェクトに設定され、オブジェクトBが無効になっていることを示します.そしてobj_を呼び出すfinalコールバック関数obj_finalは業務2が本当にやりたい削除業務をします.この時、もうオブジェクトBにアクセスできる業務はありません.オブジェクトBは安全に削除できます.
簡単な考えはこうです.