我有2个线程的应用程序。第一个线程(主线程)和第二个线程(tcp-client-thread)。 main-thread
会生成一些消息并将其置于tcp-client-thread
的队列中。 tcp-client-thread
必须将这些消息发送到服务器。但是,tcp-client-thread
也必须从服务器接收一些消息。
我该怎么做? recv
停止当前线程。设置recv
的超时时间?然后在recv
超时检查队列(来自main-thread
)之后,如果有消息发送他们,那么没有任何消息再次开始recv
吗?
答案 0 :(得分:1)
你可以在一个非旋转/非延迟线程中执行你的I / O,但它只是简单地创建另一个线程,如另一个答案中所建议的那样。简而言之,您必须修改代码以同时处理等待多种事件类型,例如,套接字上的事件或发送信号数据的条件。在Windows上,你可以使用类似WSAEventSelect + WaitForMultipleObjects而不是select的东西,在Linux上你可以使用像selectfd这样的东西。请注意,在处理套接字时,如果它被阻塞,您需要在发出recv之前检查可读性,并在发出send之前检查可写性,这样就不会阻塞其中一个。就像我说的那样,更容易创建一个发送线程...
答案 1 :(得分:1)
您需要的是非阻塞/异步I / O. 在尝试伪造任何代码之前,您应该阅读一些理论。 这篇文章,例如: http://www.wangafu.net/~nickm/libevent-book/01_intro.html
答案 2 :(得分:0)
如果要使用2个线程,则可能需要扩展到3个线程。让发送和接收函数在不同的线程上。
发送线程正在休眠,直到主线程为其提供数据。具体来说,send
软件单元中的函数将数据放入队列,然后通知线程唤醒。线程唤醒并发送数据直到队列为空,然后它返回休眠状态。
相反, receive 线程会一直休眠,直到收到数据为止。它将数据附加到另一个队列,通知主线程收到数据并重新进入休眠状态。
编辑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.
这个想法是保持数据块小,以防止丢失传入的数据。当没有数据(并且具有多次迭代)时,可以处理和输出数据。这将解决大多数同步问题。