互斥锁定线程是否使用 cpu 时间?

Does a mutex locked thread use cpu time?

我尝试将线程中的 sleep() 函数更改为 pthread_cond_timedwait(),以便在需要时可以从另一个线程停止挂起。我的问题是关于效率。因为据我所知,在使用 sleep() 时,线程正在被动等待,因此不会发生额外的 cpu 用法。调度程序如何处理互斥锁线程?它与 sleep() 相同还是在这种情况下正在积极等待?因为我可能使用了很多线程,这些线程会暂停很长时间(分钟、小时或几天),我担心我可能会使用不必要的 cpu 时间。

不,等待互斥不占用 CPU 时间。互斥量是在内核中实现的,所以它会让线程休眠直到互斥量被解锁。

下面是提炼出几乎所有多线程操作系统的行为的最佳方法,而不考虑笼统的概括:

线程通常表示为存储上下文的数据结构。调度程序保留当前“运行nable”的线程结构列表。如果线程从“运行nable”列表中删除,它将不会在任何可用的 CPU.

上安排到 运行

互斥量通常实现为对拥有互斥量的线程结构的引用,以及等待它的线程列表。线程不能同时在等待列表和调度程序的 运行nable 列表中。因此,无法调度等待互斥锁的线程,也无法占用 CPU 资源。

有注意事项和细节。例如,在多 CPU 系统上,互斥锁实现实际上可能允许在被放入等待队列之前进行短时间的“自旋等待”。这涵盖了锁可能仅由另一个 CPU 上的另一个线程短暂持有的情况,在这种情况下,完整的上下文切换可能更昂贵。不过,一般来说,您可以假设从调度程序的角度来看,阻塞的线程不会 运行nable。