2010-12-21 32 views
1

我有兩個線程需要使用相同的已建立連接發送TCP消息。我有一個對象讓我們說tcpSender,我想從展位線程中使用。我如何設計我的軟件以便不會產生併發問題和丟失的消息?發送來自兩個不同線程的TCP消息

謝謝!

回答

2

您可以將此模型設置爲生產者/消費者,其中每個線程在準備好時將消息注入到TCPSender中,並且TCPSender維護消息的FIFO隊列。插入到隊列中將被鎖定(在TCPSender內)並按順序處理。

會有另一個線程是消費當隊列不是空的消息鎖定每次消息從隊列中刪除。

兩個直接的好處是你可以支持任意數量的生產者,並且阻塞僅限於插入隊列而不是實際發送消息(從生產者的角度來看)。

2

您可以創建一個Semaphore,其中每個發送前你acquirerelease發送後。這將確保資源一次被一個線程訪問。

+0

+1是的。只要知道發送操作可以阻塞任意長的時間(例如,如果連接的另一端停止接收數據並且TCP流量控制開始運行),那麼您可能會等待很長時間以「獲取」信號。 – 2010-12-21 15:36:59

+0

這是不必要的複雜。信號量通常只在需要限制特定數量的同時訪問時才需要。如果只有一個線程被允許訪問資源,則同步塊更容易使用。 – jarnbjo 2010-12-21 15:37:26

1

如果發送此數據後不需要回答,則可以使用隊列。