我正在尝试为我的 C 代理编写并行流,其中数据在转发到目标服务器的同时被同时写入并行日志。本质上我希望有 2 个线程,其中:
- 线程对缓冲区进行非阻塞写入
- 第二个线程从缓冲区进行阻塞读取。
当然,写入线程可以超过读取线程。因此,每当发生缓冲区溢出时,我们都会将其引发并将其标记为错误。
假设线程 1(写入器)的速度是线程 2(读取器)的 5 倍。我希望线程 1 不减慢,并以读取器速度的 5 倍写入(即缓冲区不应被读取器等锁定)。这显然会导致缓冲区溢出,因为线程 1 的写入速度比线程 2 的读取速度快得多(我也想捕获缓冲区溢出)
我的理解是套接字/文件描述符要么是阻塞的,要么是非阻塞的,不能将写操作作为非阻塞而将读操作作为阻塞。我猜这是为了避免缓冲区溢出。不过,我对缓冲区溢出很满意。
任何人都可以帮助设计如何在生产者非阻塞而接收者阻塞的情况下创建此类并行线程吗?
最佳答案
您可以使用 select()
进行阻塞,直到套接字可读。让它处于非阻塞模式。如果 send()
返回 -1
且 errno
设置为 EAGAIN
或 EWOULDBLOCK
那么您需要使用select()
来告诉您套接字何时再次可写。仅当 send()
报告 EAGAIN
/EWOULDBLOCK
时执行此操作,因为套接字几乎总是可写的。
关于c - 非阻塞写入,阻塞接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26030329/