c - 阻塞模式是什么意思?

标签 c posix

当与 POSIX C 函数相关使用时,我似乎找不到“阻塞”(或“非阻塞”)的有用定义。

例如read()可以在 FIFO 管道上以阻塞或非阻塞模式调用。如果在阻塞模式下调用,它将阻塞,直到在其他地方打开它进行写入为止。

这种阻塞会占用线程吗?或者过程?还是会暂停多元宇宙的渲染?

最佳答案

阻塞意味​​着线程在等待事件发生时从 CPU 中取消调度。当一个线程取消调度时,它不会消耗任何 CPU 周期,并且允许其他线程取得进展,或者如果没有其他线程等待运行,则将 CPU 置于较低的功耗状态。

一个线程阻塞不会影响进程中可能拥有的其他线程。阻塞调用仅阻塞调用线程。

例如,当管道中没有要读取的数据时,read 会阻塞。当数据到达时,它会“解锁”并且 read 调用返回。

在内核中,每个文件描述和其他可以阻塞的对象(例如mutexcondition_variable)都有一个等待线程列表。当线程在某个对象上阻塞时,它会被附加到该对象的等待列表中并从 CPU 中取消调度。每当对象的事件发生时,内核都会检查等待列表中是否有等待此类事件的线程,以及是否有任何一个或多个线程被再次调度,并且阻塞调用最终返回。

在非阻塞模式下,此类调用不会阻塞,而是立即返回错误代码,并将 errno 设置为 EWOULDBLOCKEAGAIN,这现在,同一个 errno 值有两个不同的名称。 (pthread调用不会设置errno而是直接返回错误值)。

关于c - 阻塞模式是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55850959/

相关文章:

c++ - 将相同数据写入两个文件的有效方法

c - POSIX 进程和文件描述符

datetime - 在Java中将POSIX时间转换为Joda时间

c - dup 返回值始终为零

c++ - libxml 2 的 xml 复制 NodeList 中的内存泄漏

c - 如何使用 C 创建动态 HTML 页面?

c - 在 C 中重新创建 STDIN 重定向

c - strlen - 字符串的长度有时会增加 1

c - 获取链接列表中的先前值

linux - vfork() 失败,错误号 513