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

has*_*tes 5 c sockets multithreading

我正在处理一个多线程服务器代码,我在其中创建了 2 个线程,这些线程在accept().

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

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

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

Joh*_*ger 6

您是正确的,线程在 I/O 上阻塞时不会消耗 CPU。

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

至于是选择阻塞read()还是阻塞select()(或poll()) 来管理单个通道,这有点像苹果与橘子的比较,但如果是这些选择,那么阻塞 (或 ) 会更直接read()。这就是我会做的。同类比较更倾向于多个线程或子进程,每个read()线程或子进程阻塞不同的通道,而不是一个进程的一个线程借助select().