2016-02-23 138 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之前檢查可讀性,並在發送發送之前檢查可寫性,以免發生阻塞。就像我說的,更容易創建一個發送線程...

相關問題