gpt4 book ai didi

c - 使用 select() 然后 read() 与阻塞 read() 循环

转载 作者:行者123 更新时间:2023-12-03 21:26:58 28 4
gpt4 key购买 nike

我正在处理多线程服务器代码,我在其中创建了 2 个线程,这些线程在 accept() 之后与阻塞的 TCP 套接字交互。 .

线程 #1 检查是否有来自 msg 队列的命令并将其写入套接字。线程 #2 只是一个简单的 while 循环,它调用 read如果没有准备好读取的数据,则阻塞。

但是我的同事告诉我,我不应该用 read 做一个 while 循环。因为它会浪费 CPU 周期(这是一个阻塞 read,内核不会让线程进入休眠状态吗?),我应该使用 select()系统调用然后读取套接字。

我假设阅读线程不正确吗?哪种方法更好?

最佳答案

您是正确的,线程在 I/O 上被阻塞时不消耗 CPU。
select() syscall 是一个可行的替代方案,但它的主要用例是多路复用 I/O 从/到多个 channel 。在这种情况下,一个线程通过阻塞读取(或写入)为所有 channel 提供服务是不可行的,因为它经常被阻塞以等待来自一个 channel 的数据,而另一个 channel 已准备好并等待数据。另一方面,您不想在循环中执行非阻塞读取,如 浪费CPU。

至于是否更喜欢阻塞在read()或阻止 select() (或 poll() )用于管理单个 channel ,这有点像苹果对橘子的比较,但如果这些是选择,那么阻止 read() 会更直接.这就是我会做的。苹果对苹果的比较将更多地沿着多线​​程或子进程的路线进行,每个线程或子进程都阻塞在 read() 上。在 select() 的帮助下,使用不同的 channel ,而不是一个进程的一个线程管理多个 channel .

关于c - 使用 select() 然后 read() 与阻塞 read() 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29107904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com