繁体   English   中英

非阻塞写入和阻塞接收

[英]Non Blocking write, and blocking recv

我正在尝试为我的C代理编写并行流,其中将数据同时写入并行日志,同时将其转发到目标服务器。 本质上,我正在寻找2个线程,其中:

  1. 线程对缓冲区执行非阻塞写入
  2. 第二线程执行从缓冲区的阻塞读取。

自然,写程序线程可以超过读程序线程。 因此,每当确实发生缓冲区溢出时,我们都会将其引发并标记为错误。

假设线程1(编写者)的速度是线程2(读者)的5倍。 我希望线程1不会减慢速度,并以读取器速度的5倍进行写入(即缓冲区不应被读取器等锁住)。 这显然会导致缓冲区溢出,因为线程1的写入速度快于线程2的读取速度(我也想捕获缓冲区溢出)

我的理解是套接字/文件描述符要么是阻塞的,要么是非阻塞的,不能将写操作作为非阻塞,而不能将读取作为阻塞。 我猜这是为了避免缓冲区溢出。 但是,缓冲区溢出我很好。

任何人都可以帮助设计如何在生产者非阻塞而接收者阻塞的情况下创建此类并行线程吗?

您可以使用select()进行阻塞,直到套接字可读为止。 使其处于非阻塞模式。 如果send()返回-1errno设置为EAGAINEWOULDBLOCK则您将需要使用select()来告诉您套接字何时再次变为可写状态 仅当send()报告EAGAIN / EWOULDBLOCK时才这样做,因为套接字几乎总是可写的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM