C:线程 semaphore_wait 与 while 循环

Ara*_*and 5 c semaphore processor pthreads while-loop

以下代码片段在处理器使用方面有什么区别吗?

void *ManageSequencer(void *argument){
  SomeClass *someClass = (SomeClass *)argument;

  while (someClass->ThreadIsAlive()) {

    while(someClass->isAsleep) { }

    someClass->isAsleep = true;

    //thread execution statements 

  }
  return argument;
}
Run Code Online (Sandbox Code Playgroud)

其中某个类isAsleep=false在需要线程执行时定期设置

或者

void *ManageSequencer(void *argument){
  SomeClass *someClass = (SomeClass *)argument;

  while (someClass->ThreadIsAlive()) {

    semaphore_wait(sem);

    //thread execution statements 

  }
  return argument;
}
Run Code Online (Sandbox Code Playgroud)

其中 someClasssemaphore_signal(sem);在需要线程执行时定期调用。

这个问题与原子性无关,只是 while 循环是否会导致处理器比信号量解决方案做更多的工作。信号量内部是否只有一个 while 循环,该循环会阻塞直到满足条件(信号量的增量大于零)?

Jas*_*oco 4

是的,第一个会导致处理器比第二个做更多的工作。基本上,每当第一个示例中的活动线程被调度时,它就会耗尽在该条件下旋转的所有处理器时间,直到调度程序抢占它并给另一个线程时间。这意味着您有上下文切换,并且线程的整个(可能)时间片每次都被 100% 使用,但实际上没有任何作用。

第二个示例将线程捕获在内核中,因此在内核获取信号并恢复线程之前,它根本不会获得任何处理器时间。一旦发生这种情况,调度程序将再次为其提供处理时间,但现在我们知道它有实际的工作要做,而不仅仅是使用与 CPU 挂钩的整个时间片。