在 C 中处理 while 循环的通用 CPU 非阻塞方式

A generic CPU non blocking way to handle while loop in C

我会问一个非常笼统的问题,这个问题困扰了我一段时间。 很多时候,我们必须等待非阻塞函数的结果,例如从文件、套接字或设备读取字节。

为什么要为了阻塞而浪费非阻塞函数的天赐之物?

那么,是否有可能,至少在 POSIX API 中,做某种 while(!somethingToRead()) forceToPassToNextJobInScheduler();

到处都找不到这方面的资料,如果能限制线程的使用就好了

我没有找到任何东西的事实向我表明,要么我没有使用正确的关键字,要么没有类似的东西是可能的。但我希望那会很棒。

感谢 libvpoll 背后的研究人员,我终于找到了问题的答案:我所说的与“forceToPassToNextJobInScheduler”的确切功能是 sched_yield()https://man7.org/linux/man-pages/man2/sched_yield.2.html

我已经接近解决方案了,打开了一个关于预定函数的选项卡:https://man7.org/linux/man-pages/man7/sched.7.html 但由于不是 low-level POSIX 专家,因此很难轻松找到正确的解决方案。

你不需要这个。这就是已经阻塞的作用。当您的进程被阻塞时,调度程序会自动 运行s 下一个未被阻塞的 job/process/thread。

如果你像这样写一个循环,唯一的区别是调度程序认为你的线程没有被阻塞,它会不断切换回你的线程然后您的线程将不断切换回调度程序 - 浪费时间。

最好使用实际阻塞,这样调度程序就会知道你的线程被阻塞了,并且不会运行它直到它被解除阻塞。

Why waste the godsend of non-blocking functions for a blocking while?

你不知道。要充分利用 non-blocking 函数,您必须以 non-blocking 的方式编写 整个程序 ,可能每个连接使用 struct 而不是一个线程,以及类似epoll的东西来查看哪些连接有新数据。