簡體   English   中英

需要維護訂單的多線程作業

[英]Multi-threading jobs that need to maintain order

我的ac / c ++進程隊列很長,該隊列中的每個元素都需要發送到多個(TCP)服務器。 單線程是一個可行的選項,但是速度很慢。

我需要實現一個多線程解決方案。 我的進程事先不知道服務器的數量。 第一個想法是為每個服務器創建一個線程。 管理器線程讀取隊列中的新元素,找到目標,然后分派到與目標匹配的線程。

重要說明。 工作可能是依賴的。 如果job_5未完成,我不想執行job_10。 訂單需要維護。

首先,我想請您對這個問題發表意見。 其次,我正在搜索C ++實現以供參考。 第三,我正在尋找描述類似問題的書籍/資源。

您看過boost asio嗎? 它支持“線程池”的概念,因此您可以擁有一個異步處理大量連接的線程池,而不是每個服務器一個線程(即同步線程)。 性能也不錯...

您如何得出需要多線程解決方案的結論? 當您說您的單線程解決方案“緩慢”時,您是什么意思? 您是說在將項目發送到服務器時是否阻止了其他處理(也許是UI東西?)? 還是整個過程花了太長時間?

您的描述在這個問題上是模棱兩可的:是否需要將每一項發送到所有服務器,還是只發送到一台? 似乎只有一個,但我不確定。 如果必須將其發送給所有人,那么多線程解決方案的復雜性將大大增加。

一旦發送了項目,您是否可以將其從隊列中刪除,還是需要等待服務器的確認? 如果必須等待,那么隊列管理將變得很棘手-您必須先確認該項目,然后才能刪除它,因此您必須以某種方式將其標記為待處理,並且從隊列中選擇下一個項目的線程將需要確保它不會選擇待處理的項目。 當項目成功發送后,必須將其從隊列中刪除,這意味着對隊列的並發寫訪問。

您如何處理錯誤? 如果無法發送項目,它是否留在隊列中以供以后重試,還是被移至失敗列表,還是只是被記錄並丟棄了? 在多線程系統中,您將異步了解故障,這意味着同時對錯誤處理過程進行寫訪問。

您說您的進程事先不知道有多少台服務器。 這個數字在處理過程中可以更改嗎?

一定要研究多線程,但是您可能會發現您的“慢速”單線程解決方案可以最好地滿足您的業務需求-易於實現且可靠。 如果沒有,那么希望其中的一些問題對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM