簡體   English   中英

如何在多線程環境中處理共享內存?

[英]How to handle shared memory in a multi threaded environment?

我有一個客戶端 - 服務器模型。 多線程客戶端通過 TCP 套接字向服務器發送消息。 服務器也是多線程的,每個請求都由工作池中的一個線程處理。

現在,服務器必須通過共享內存 IPC 將消息發送回客戶端。 例如:

multi threaded client --- GET /a.png --> server
                                          |
                                          |
                                       one worker
                                          |
                                          |
                                         \ /
                       puts the file descriptor into the shared memory  

當工作線程將信息添加到共享內存時,我如何確保它被請求它的同一個客戶端讀取?

我在這里對如何進行感到無能為力。 目前,我已經創建了一段共享內存,服務器上有 20 個線程,客戶端上有 10 個線程。

雖然您可以在線程之間使用 IPC,但這通常不是一個好主意。 無論如何,線程共享所有內存,因為它們是同一進程的一部分,並且線程之間有非常有效的通信機制。

讓同一個線程一直處理請求可能會更容易。 這樣,您就不必在線程之間傳遞請求。 但是,如果您有一個正在處理的請求池,那么讓一個線程能夠“放下”一個請求,然后能夠讓該線程或另一個線程“接收”該請求通常是有意義的。要求。

執行此操作的最簡單方法是將與請求相關的所有信息都保存在單個結構或對象中。 使用標准線程同步工具(如互斥鎖)來控制查找對象、獲取對象的所有權等。

因此,當 I/O 線程收到請求時,它會創建一個新的請求對象,獲取互斥鎖,並將其添加到服務器正在處理的全局請求集合中。 工作線程可以檢查這個全局集合以查看哪些請求需要工作,或者它們可以由創建請求的線程顯式調度。

暫無
暫無

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

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