1

OS : Oracle VM Virtual Box 上の FreeBSD 8.2

読み取りロックを取得しようとするプロセスが、取得できるまでブロックされることをテストしようとしています。プロセス #1 で初期化rw_lockし、ライターとしてロックをロックした後、blocking を使用してリーダーとしてロックを取得しようとする 2 番目のプロセスを作成しますrw_rlock()。私が狙っているのは、プロセス #1 が書き込みロックを解放するまでプロセス #2 をブロックすることです。そのため、一時停止を使用して、プロセス #2 をスケジュールするのに十分な時間を確保しようとしています。ただし、このシナリオでは、この同じ一時停止によりシステムが何らかの形でクラッシュします。これを削除すると、プログラムは正常に実行されるためです。プロセス #1 の一時停止をビジー ループに置き換えると、プロセス #1 が終了するまでプロセス #2 がスケジュールされないため、テストのポイントが台無しになります。DELAY()また、プロセス #2 をスケジュールすることもできません。任意のポインタをいただければ幸いです。

プロセス #1:

static void test_rw_rlock(void)
{ 
    const int seconds = 1;
    rw_init(pResourceLock, "RWLock");
    rw_wlock(pResourceLock);
    kproc_create(&use_rw_rlock, NULL, NULL, 0, 0, "use_rw_rlock()");
    pause("---", hz * seconds);
    rw_wunlock(pResourceLock);
    rw_destroy(pResourceLock);
}

プロセス #2:

static void use_rw_rlock(void* arg)
{
    rw_rlock(pResourceLock);
    rw_unlock(pResourceLock);
    kproc_exit(0);
}
4

1 に答える 1

1

rwロックを保持したまま寝ることはノーノーです。

于 2012-08-03T06:09:53.973 に答える