c - 互斥锁线程是否使用 cpu 时间?
问题描述
我尝试将线程中的 sleep() 函数更改为 pthread_cond_timedwait() 以便在需要时可以从另一个线程停止暂停。我的问题是关于效率。因为据我了解,在使用 sleep() 时,线程处于被动等待状态,因此不会发生额外的 cpu 使用。调度程序如何处理互斥锁线程?它与 sleep() 相同还是在这种情况下正在积极等待?因为我可能会使用很多线程,这些线程会被暂停很长一段时间(几分钟、几小时或几天),我担心我可能会使用不必要的 CPU 时间。
解决方案
这是提取几乎所有多线程操作系统的行为而不考虑全面概括的最佳方法:
线程通常表示为存储上下文的数据结构。调度程序保留当前“可运行”的线程结构列表。如果线程从“可运行”列表中删除,它将不会被安排在任何可用的 CPU 上运行。
互斥锁通常被实现为对拥有互斥锁的线程结构和等待它的线程列表的引用。一个线程不能同时在等待列表和调度程序的可运行列表中。因此,无法调度等待互斥锁的线程,也无法占用 CPU 资源。
有警告和细节。例如,在多 CPU 系统上,互斥锁实现实际上可能允许在被放入等待队列之前进行短时间的“自旋等待”。这涵盖了锁定可能仅由另一个 CPU 上的另一个线程短暂持有的情况,在这种情况下,完整的上下文切换可能会更昂贵。不过,一般来说,您可以假设从调度程序的角度来看,阻塞的线程将无法运行。
推荐阅读
- excel - 传输大量命名范围的过程错误太大
- c# - 在数据结构项目 C# 中查找二叉搜索树键的问题
- webview - 如何在 WebView 中停止视频播放
- python - 将单级 DataFrame 与 3 级 DataFrame 合并
- linux - Bash 提示出现在输出中间
- php - php无法在浏览器中查看下载的PDF文件
- angular - 如果 url 请求返回 404,它可能会返回默认图像吗?
- spss - 使用SPSS可以查到人们的习惯是否发生了变化
- reactjs - 如何使用带有 React.js 的预签名 URL 将文件上传到 S3
- reactjs - 在 react-redux 连接组件中进行单元测试时出错