2016-02-23 137 views
0

我有一个包含2个线程的应用程序。第一个线程(主线程)和第二个线程(tcp-client-thread)。 main-thread生成一些消息并将其放入队列tcp-client-threadtcp-client-thread必须将这些消息发送到服务器。但是,tcp-client-thread也必须从服务器接收一些消息。在一个线程中通过tcp套接字发送和接收数据

我该怎么做? recv停止当前线程。设置超时时间为recv?然后recv超时检查队列(从main-thread),如果有消息发送他们是没有任何消息再次启动recv

回答

0

如果您打算使用2个线程,则可能需要扩展到3个线程。让发送和接收函数在不同的线程上。

发送线程正在休眠,直到主线程给它的数据。具体而言,send软件单元中的函数将数据放入队列中,然后发出线程唤醒信号。线程唤醒并发送数据,直到队列为空,然后重新进入休眠状态。

相反,收到线程休眠,直到它收到数据。它将数据附加到另一个队列,通知主线程已收到数据并返回到睡眠状态。

编辑1:一个线程
每标题,如果你想在一个线程执行I/O,你需要有一个轮询循环(你可以有等待有限的,但不建议)。

Loop: 
    if (data received) then place data into input queue. 
    if (data in input queue) process some data (use small chunks). 
    if (data in output queue) send some data. 
end-loop. 

这个想法是保持数据块小以防止丢失传入数据。当没有数据(和多次迭代)时,数据可以被处理和输出。这将解决大多数同步问题。

1

您可以在一个非旋转/非延迟线程中执行您的I/O,但它要复杂得多,只需创建另一个线程即可。简而言之,您必须修改代码以处理同时处理多个事件类型的情况,例如,套接字上的事件或发送数据的条件信号。在Windows上,您可以使用WSAEventSelect + WaitForMultipleObjects而不是select,而在Linux上,您可以使用eventfd和select之类的东西。请注意,在处理套接字时,如果发生阻塞,您需要在发出recv之前检查可读性,并在发送发送之前检查可写性,以免发生阻塞。就像我说的,更容易创建一个发送线程...

相关问题