【发布时间】:2012-08-02 20:38:36
【问题描述】:
操作系统:Oracle VM Virtual Box 上的 FreeBSD 8.2
我正在尝试测试尝试获取读锁的进程是否会被阻塞,直到它能够获取它。在进程#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);
}
【问题讨论】:
-
信号量不考虑吗? (POSIX 或 Sys V)
-
我必须使用 rwlock,因为我正在使用的代码使用它
-
只是想一想,如果你
fork()在输入锁码之前暂停,你还会崩溃吗? -
您确定您的进程共享相同的地址空间吗?
-
@TJD:来自 kproc 的手册页“新进程与进程 0(交换进程)共享其地址空间,并且仅在内核模式下运行。”所以他们应该共享地址空间。如果我在新进程中增加一个变量,则更改会反映在前一个进程中。
标签: c unix process scheduling freebsd