2011-04-11 90 views
1

對於我的實現,我使用mmap爲進程間通信分配共享內存。在這個共享內存中,我初始化一個隊列(我將第一個和最後一個指針設置爲NULL)。在共享內存中創建隊列POSIX

問題是如何將新項目推入隊列。通常我會用malloc分配我的'隊列項目結構'然後指向它,但我不能使用它,我可以嗎?我需要在共享內存中以某種方式分配它。我可能可以使用另一個mmap並將其推送到那裏,然後指向它,但它看起來不正確,因爲我必須多次這樣做。

這可以簡單地完成,或者我應該考慮不同的解決方案?

感謝您的任何想法。

回答

2

一般規則,以在共享存儲器中創建隊列:

1)從不使用指針作爲共享的元素,因爲OS可以選擇在不同的工藝不同的虛擬地址。始終使用共享內存視圖基址或數組索引中的偏移量,或者總是使用與位置無關的偏移量。

2)您必須手動分區您的共享內存。例如。您必須知道您的隊列中可能包含多少項目,並且對共享區域進行維度定位,以便它可以包含「haeder」(插入索引和提取索引...)以及項目數組。定義一個包含正確大小的「標題」和「項目數組」的結構通常就足夠了:內存大小是sizeof(your_structure),它的地址是mmap返回的地址。

3)仔細考慮多線程和多處理問題。如果可以阻止訪問線程可以接受,則用互斥鎖保護對共享內存的訪問。但是如果你想創建一個「非阻塞」隊列,你至少必須使用原子操作來改變相關的字段,並考慮任何可能的時序問題。

Regards

+0

謝謝你的建議,非常感謝。使用數組而不是鏈接列表聽起來要容易得多。我可以看到唯一的缺點是,使用數組我將佔用更多的空間,我現在實際上需要。這就是我首先決定鏈接列表的原因,但我沒有意識到答案中的第1)條。 thx再次 – tsusanka 2011-04-11 11:34:03