条件力学。信号()

时间:2011-01-08 17:09:24

标签: multithreading conditional-statements signals

如果我有如下线程

void thread(){

while() {

lock.acquire();

if(condition not true)

{

Cond.wait()

}

// blah blah

Cond.Signal();

lock.release();
}
}

嗯我想我的主要问题是信号线程是否在cond.signal()之后继续运行一段时间或者立即放弃CPU?我希望在某些情况下不要在唤醒线程完成执行之前释放锁定,在其他情况下,在发出信号后立即释放锁定可能是有益的,而无需等待其他唤醒线程完成。

我知道如果有任何线程在等待条件,那么他们会在Cond.signal()上被唤醒。但你是什么意思的woekn up - 放在准备好的队列上或调度程序确保它立即运行? 那信号线程怎么样呢?它会在发出信号的同一条件下睡觉吗? ..那么其他一些线程必须将其唤醒以使其释放锁定。?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您的环境(操作系统,库,语言......)以及如何实现同步原语。既然你没有指明任何我只是给出一般答案。

当一个线程进入休眠状态时,大多数环境会选择将它从调度程序的就绪队列中删除,并且该线程将放弃其剩余的CPU时间。当被唤醒时,线程被简单地放回到就绪队列中,并且在下次调度程序从队列中选择它时将继续执行。

线程也可能会执行一些活动等待(旋转),而不是从调度程序的就绪队列中删除。在这种情况下,线程将立即恢复执行。请注意,由于线程在旋转时仍然可以耗尽CPU时间,因此可能需要等待在唤醒之前重新安排。如果您的关键部分非常小并且您不想为调度开销付费,那么这是一种有用的策略。

混合方法是在从调度程序的就绪队列中删除线程之前执行少量活动等待。

至于信令线程,除非您的环境明确指定(我不能以任何理由但你永远不知道),我不希望调用signal()来阻止你必须唤醒的方式它了。 Signal()可能必须与调用signal()的其他线程同步,但这些是实现细节,你不应该对它做任何事情。