阻止模式是什么意思?

时间:2019-04-25 13:53:27

标签: c posix

在与POSIX C函数结合使用时,我似乎找不到“阻塞”(或就此而言为“非阻塞”)的有用定义。

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

这种阻塞是否只会占用线程?还是过程?还是会暂停多宇宙的渲染?

1 个答案:

答案 0 :(得分:4)

阻塞表示在等待事件发生时将线程从CPU取消调度。对线程进行调度后,它不会占用任何CPU周期,并且如果没有其他线程在等待运行,它还可以使其他线程进步或使CPU处于低功耗状态。

一个线程阻塞不会影响您在此过程中可能拥有的其他线程。阻塞调用只会阻塞调用线程。

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

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

在非阻塞模式下,此类调用不会阻塞,但会立即返回错误代码,并且将errno设置为EWOULDBLOCKEAGAIN,如今,这两个错误是同一{ {1}}值。 (pthread调用不会设置errno,而是直接返回错误值)。