c - 阻塞模式是什么意思?
问题描述
当与 POSIX C 函数相关时,我似乎找不到“阻塞”(或就此而言“非阻塞”)的有用定义。
例如read()可以在 FIFO 管道上以阻塞或非阻塞模式调用。如果在阻塞模式下调用,它将阻塞,直到它在其他地方打开以进行写入。
这种阻塞会占用线程吗?还是过程?还是会暂停多元宇宙的渲染?
解决方案
阻塞意味着线程在等待事件发生时从 CPU 中取消调度。当一个线程被取消调度时,它不会消耗任何 CPU 周期,并允许其他线程取得进展,或者如果没有其他线程等待运行,则将 CPU 置于较低的功率状态。
一个线程阻塞不会影响您在进程中可能拥有的其他线程。阻塞调用只会阻塞调用线程。
例如,read
当管道中没有要读取的数据时阻塞。当数据到达时,它“解除阻塞”并且read
调用返回。
在内核中,每个文件描述和其他可以阻塞的对象(例如mutex
或condition_variable
)都有一个等待线程列表。当一个线程在一个对象上阻塞时,它被附加到该对象的等待列表中,并从 CPU 中取消调度。每当对象的事件发生时,内核都会检查等待列表中的等待线程以等待此类事件,并且是否有任何一个或多个线程再次被调度并且阻塞调用最终返回。
在非阻塞模式下,此类调用不会阻塞,而是立即返回errno
设置为EWOULDBLOCK
or的错误代码EAGAIN
,现在它们是相同errno
值的两个不同名称。(pthread 调用不设置errno
而是直接返回错误值)。
推荐阅读
- c# - 机器中的多任务与多进程
- reactjs - 日期选择器 npm 在本机反应中不起作用
- node.js - Svelte/Sapper - 遇到与 Luxon 和 Lodash 相关的构建错误
- android-fragments - 尝试在 kotlin 的片段中执行自动图像滑块,但是 runouithread 不起作用。任何可能的解决方案?
- java - 浏览器和邮递员返回结果,但由于 %26,Rest 模板返回 0 个结果
- django - 反向访问抽象模型中的 OneToOne 字段
- python - 如何在python中计算矩阵的-1/2幂
- language-agnostic - 固件和嵌入式软件之间的真正区别是什么
- python - pyqtgraph 不显示整个数据
- android - OnCreate() 方法会影响 Android Profiling 中的 Misc 时间吗?