1

操作系统:Oracle VM Virtual Box 上的 FreeBSD 8.2

我正在尝试测试尝试获取读锁的进程是否会被阻止,直到它能够获取它。在 Process #1 中初始化rw_lock并作为写入者锁定锁之后,我创建了第二个进程,该进程尝试使用阻塞作为读取者获取锁rw_rlock()。我想要的是让进程#2 被阻塞,直到进程#1 释放写锁,所以我试图使用暂停来确保进程#2 有足够的时间来安排。然而,在这种情况下,同样的暂停会以某种方式使系统崩溃,因为如果将其删除,程序运行良好。如果我用进程#1 中的繁忙循环替换暂停,进程#2 在进程#1 完成之前不会被安排,因此它会破坏测试的重点。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 回答