簡體   English   中英

使用protobuf進行線程通信

[英]Using protobuf for thread communication

我知道關於多線程通信的討論很多,但是我沒有發現涉及protobuf的通信。

背景:我最近編寫了一個應用程序,其中使用protobuf在套接字之間進行通信。 我的應用程序產生了不同的線程,這些線程應該可以相互通信。

這是通過將對象(類的實例)推送到“ std :: queue”來完成的。 因此,基本上我一個線程使用我的信息創建了一個類的實例,將其推送到“隊列”,而我的其他線程則從此隊列(或緩沖區)中彈出對象並進行處理。

現在我想知道使用“ protobuf”進行通信而不是實例化對象是否會更好。 主要思想是創建一個protobuf消息,而不是一個類的整個實例,並將其推入隊列。 因此,基本思想是創建一個“隊列”,其中包含使用“ protobuf”方法SerializeToString()生成的二進制字符串列表。

難道這是在線程之間共享數據的更干凈的方式(更有效的方式)嗎?

總結一下:使用方法1,可以在std::queue上使對象入隊和出隊。 使用方法2,您仍將使用隊列,但僅將對象的必要部分序列化到隊列中。

最后,聽起來就線程而言沒有什么區別。 生產者/消費者情況仍然相同。 無論您使用哪種通信方式,客戶端代碼都不會更改。 兩種方式都不是“清潔”。

方法1更有效。 線程是為了優化而發明的,因此您可以共享內存。

方法1創建一次對象,然后銷毀一次。 方法2創建一個對象兩次並將其銷毀兩次。 該對象由生產者線程創建,然后將其序列化並銷毀該對象。 使用者線程根據反序列化的數據重新創建對象,該線程使用它然后銷毀它。 即使方法2可以以某種方式優化對象實例化(例如,使用char數組而不是string對象),也可以將相同的優化應用於方法1。

由於共享內存,方法1可以簡單地讀取對象。 方法2必須將對象信息復制到緩沖區中,然后再將其復制回來。 那是兩個額外的副本。

方法1具有隊列的開銷。 通常,隊列僅具有指向該對象的指針,因此排隊和出隊很便宜。 隊列可以在數組上實現。 方法2還具有隊列的開銷。 但是,數據全部存儲在隊列中,因此入隊和出隊取決於序列化數據的大小。 即使序列化的數據很小,它也不比方法1快。

方法1是共享內存多線程。 方法2更多地是一種分布式體系結構/消息傳遞/ IPC / COM風格的范例。 后者在90年代和2000年代初期頗為流行,但此后逐漸消失。

線程與消息傳遞實際上是90年代OS研究中的經典辯論。 如果您想了解更多有關此的內容,則應閱讀有關微內核的歷史。 在優化消息傳遞方面付出了很多努力,但最終,微內核永遠無法匹敵單片內核的性能。

暫無
暫無

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

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