如何使用带有 OR 原语的信号量锁定某些线程?
How to lock some thread using semaphores with OR premitive?
我正在考虑一个例子来进一步评估我的问题。考虑三个线程,T_1、T_2 和 T_3.
- 如果 T_2 在 T_1 完成其主要段之前无法执行,那么我将简单地在 T_2 的开头放置一个 semwait() 并将放置 semsignal()相同的信号量。
- 如果 T_2 在 T_1 和 T_3 完成它们的主代码段之前无法执行,那么我将简单地让 T_2 等待两个 semsignal() 函数在 T_1 和 T_3.
的末尾
但是,如果 T_2 在 T_1 或 T_3 完成其主要代码段之前无法执行怎么办?如果我让它等待某个 OR 函数,它可能会在第一个表达式上被阻塞,甚至没有测试第二个表达式,因为 T_1 不允许它 运行 但 T_3 允许。所以我的问题是如何让它等待这种情况?
可以吗?
T2
...
sem_wait(s1)
T1, T3
...
mutex_lock(m1)
if (!signaled) {
sem_signal(s1)
signaled = true;
}
mutex_unlock(m1)
我正在考虑一个例子来进一步评估我的问题。考虑三个线程,T_1、T_2 和 T_3.
- 如果 T_2 在 T_1 完成其主要段之前无法执行,那么我将简单地在 T_2 的开头放置一个 semwait() 并将放置 semsignal()相同的信号量。
- 如果 T_2 在 T_1 和 T_3 完成它们的主代码段之前无法执行,那么我将简单地让 T_2 等待两个 semsignal() 函数在 T_1 和 T_3. 的末尾
但是,如果 T_2 在 T_1 或 T_3 完成其主要代码段之前无法执行怎么办?如果我让它等待某个 OR 函数,它可能会在第一个表达式上被阻塞,甚至没有测试第二个表达式,因为 T_1 不允许它 运行 但 T_3 允许。所以我的问题是如何让它等待这种情况?
可以吗?
T2
...
sem_wait(s1)
T1, T3
...
mutex_lock(m1)
if (!signaled) {
sem_signal(s1)
signaled = true;
}
mutex_unlock(m1)