阻塞模式是什么意思?
What does blocking mode mean?
当与 POSIX C 函数相关时,我似乎找不到 "blocking"(或就此而言 "non-blocking")的有用定义。
例如 read() 可以在 FIFO 管道上以阻塞或非阻塞模式调用。如果以阻塞模式调用,它将阻塞直到在其他地方打开以进行写入。
这个阻塞会不会直接占线程?还是过程?还是会暂停多元宇宙的渲染?
阻塞意味着线程在等待事件发生时被取消调度 CPU。当一个线程被取消调度时,它不会消耗任何 CPU 周期并允许其他线程取得进展或将 CPU 置于较低功率状态,如果没有其他线程等待 运行.
一个线程阻塞不会影响您在进程中可能拥有的其他线程。阻塞调用只会阻塞调用线程。
例如,read
当管道中没有数据可读时阻塞。当数据到达时 "unblocks" 并且 read
调用 returns.
在内核中,每个文件描述和其他可以阻塞的对象(例如mutex
或condition_variable
)都有一个等待线程列表。当一个线程阻塞在一个对象上时,它会被附加到该对象的等待列表中,并从 CPU 中取消调度。每当对象的事件发生时,内核都会检查等待列表中是否有等待此类事件的线程,如果有任何一个或多个线程会再次被调度,最终阻塞调用 return.
在非阻塞模式下,此类调用不会阻塞,但 return 会立即出现一个错误代码,其中 errno
被设置为 EWOULDBLOCK
或 EAGAIN
,现在是两个相同 errno
值的不同名称。 (pthread 调用不设置 errno
而是直接 return 错误值)。
当与 POSIX C 函数相关时,我似乎找不到 "blocking"(或就此而言 "non-blocking")的有用定义。
例如 read() 可以在 FIFO 管道上以阻塞或非阻塞模式调用。如果以阻塞模式调用,它将阻塞直到在其他地方打开以进行写入。
这个阻塞会不会直接占线程?还是过程?还是会暂停多元宇宙的渲染?
阻塞意味着线程在等待事件发生时被取消调度 CPU。当一个线程被取消调度时,它不会消耗任何 CPU 周期并允许其他线程取得进展或将 CPU 置于较低功率状态,如果没有其他线程等待 运行.
一个线程阻塞不会影响您在进程中可能拥有的其他线程。阻塞调用只会阻塞调用线程。
例如,read
当管道中没有数据可读时阻塞。当数据到达时 "unblocks" 并且 read
调用 returns.
在内核中,每个文件描述和其他可以阻塞的对象(例如mutex
或condition_variable
)都有一个等待线程列表。当一个线程阻塞在一个对象上时,它会被附加到该对象的等待列表中,并从 CPU 中取消调度。每当对象的事件发生时,内核都会检查等待列表中是否有等待此类事件的线程,如果有任何一个或多个线程会再次被调度,最终阻塞调用 return.
在非阻塞模式下,此类调用不会阻塞,但 return 会立即出现一个错误代码,其中 errno
被设置为 EWOULDBLOCK
或 EAGAIN
,现在是两个相同 errno
值的不同名称。 (pthread 调用不设置 errno
而是直接 return 错误值)。