互斥锁线程是不是使用 CPU 时间?

Posted

技术标签:

【中文标题】互斥锁线程是不是使用 CPU 时间?【英文标题】:Does a mutex locked thread use cpu time?互斥锁线程是否使用 CPU 时间? 【发布时间】:2021-11-11 16:32:16 【问题描述】:

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

【问题讨论】:

问题不清楚。您对条件变量或互斥锁感兴趣吗? 对不起,我的理解是,如果一个线程正在等待一个条件变量,它就处于互斥锁中。我对整个概念很陌生,所以我可能错了@SergeyA 并非如此。它正在等待变量已更改的信号。互斥锁只是辅助性的,因为它可以防止多个线程在条件发出信号后尝试访问该变量。 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

不,等待互斥体不会占用 CPU 时间。互斥体是在内核中实现的,因此它使线程处于休眠状态,直到互斥体被解锁。

【讨论】:

也许吧。请参阅***.com/questions/19863734/… 其他操作系统也使用自适应互斥锁,它会在睡觉前旋转一段时间。

以上是关于互斥锁线程是不是使用 CPU 时间?的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁,自旋锁,原子操作原理和实现

多线程安全----同步锁(互斥锁)

Java04 线程同步问题解决——线程锁(同步锁互斥锁)

信号量,互斥锁,自旋锁

Java并发入门之互斥锁-解决原子性问题

在我的情况下是不是需要互斥锁[关闭]