2014-09-25 226 views
0

我正在尝试为我的C代理编写并行流,其中数据同时写入并行日志,同时将其转发到目标服务器。从本质上讲,我期待有2个线程,其中:非阻塞写入和阻塞recv

  1. 线程执行非阻塞写缓冲区
  2. 第二个线程并从缓冲区中读取一个阻塞。

自然地,作者线程可以超出读者线程。因此,无论何时发生缓冲区溢出,我们都会将其标记为错误。

假设线程1(作者)是线程2(读者)的5倍。我希望线程1不要放慢速度,并以5倍的速度读写器(即缓冲区不应被阅读器锁定)。这显然会导致缓冲区溢出,因为线程1写入比线程2正在读取的速度快得多(我也想捕获缓冲区溢出)

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

任何人都可以帮助设计如何创建这样的并行线程,其中生产者是非阻塞的,并且接收器被阻塞?

回答

0

您可以使用select()来阻塞,直到套接字可读。保持非阻塞模式。如果send()返回-1errno设置为EAGAINEWOULDBLOCK那么您将需要使用select()来告诉你何时套接字已成为可写再次。只有在send()报告EAGAIN/EWOULDBLOCK时才这样做,因为套接字几乎总是可写的。

+0

请原谅,如果我的理解不完全正确,我正在调查选择系统调用。我明白选择告诉何时文件描述符已准备好进行写入/读取I/O操作。我想重新说明我不希望写操作的速度降低,因为读取操作很慢......请选择帮助我这么做? – tsar2512 2014-09-25 18:02:26

+1

@nipun是的,它会的。你将使用'select'来阻塞,直到套接字可读。 – 2014-09-25 18:21:53

+1

@nipun:TCP节流传输。如果接收缓冲区填满,则发送缓冲区被阻止。您可以尽可能多地将数据传输到send()中,但是如果接收缓冲区填满,那么send()不能接受更多的数据,并且会失败并返回EAGAIN/EWOULDBLOCK直到接收缓冲区释放上一些房间。当发生这种情况时,'select()'会告诉你什么时候send()可以再次接受新的数据。 – 2014-09-25 18:23:42