1

SYS V セマフォを使用しなければならないプロジェクトがあります。セマフォを(同じキーを使用して)共有し、次のコードで初期化するプロセスがいくつかあります。

bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key)
{
    /* Try to get a semaphore, to check if you will be an owner */
    *sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
    if (*sem == -1)
    {
        if (errno == EEXIST)
        {
            /* We are not owners, get semaphore without exclusive flag */
            *sem = semget(key, 1, IPC_CREAT | 0666);
            if (*sem == -1) return false;
        }
        else return false;
    }
    else
    {
        /* We are owners, initialize semaphore */
        int return_value = semctl(*sem , 0, SETVAL, sem_value);
        if (return_value == -1) return false;
    }

    return true;
}

私の問題は、このセマフォを使用しているすべてのプロセスが終了するときに、このセマフォを削除したいということです。使用:

semctl(*sem, 0, IPC_RMID)

オプションではありません。セマフォを即座に削除し、他のプロセスは未定義の動作をしました。SYS V API でそれを行う正しい方法が見つかりません。

4

1 に答える 1

0

参照カウントを使用できます。各プロセスは、セマフォの初期化後に参照カウンターをインクリメントし、プロセスが終了するとデクリメントします。最後に 0 にデクリメントすると、それも削除されるか、他のすべてのプロセスが終了したことを認識したときにメイン プロセスにクリーンアップされます。

おそらく、参照カウンターへのアクセスを同期するために別のロックメカニズムも必要になるでしょう。これは、他のプロセスを生成して待機するメインプロセスでおそらく作成/削除します。

また、プロセスが異常終了する可能性がある場合は、ダングリング参照に注意してください。

于 2013-01-16T14:32:24.617 に答える