首页 > 解决方案 > 互斥锁线程是否使用 cpu 时间?

问题描述

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

标签: cmultithreadingmutexsleepcpu-usage

解决方案


这是提取几乎所有多线程操作系统的行为而不考虑全面概括的最佳方法:

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

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

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


推荐阅读