2011-11-16 58 views
1

我打開一段共享內存並獲取它的句柄。我知道有幾個向量存儲在內存中的數據。我想訪問這些數據向量並對它們執行一些操作。我怎樣才能做到這一點?將共享內存視爲對象是否合適,以便我們可以將這些向量定義爲對象的字段,並將那些需要的操作定義爲對象的成員函數?訪問共享內存中的數據C++ POSIX

我從來沒有處理過共享內存。更糟的是,我是C++和POSIX的新手。有人可以提供一些指導嗎?簡單的例子將不勝感激。

+0

通過'shmemget'或'CreateFileMapping'的共享內存適用於進程之間的共享。你在考慮這個進程間通信嗎? – minjang

+0

@minjang是的。可能因爲我是內存管理新手,我覺得傾向於將共享內存視爲對象,並希望訪問其數據並對其執行操作,就像我們將對象一樣。 –

+2

看看提升。[在共享內存中創建矢量](http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container) –

回答

0
int my_shmid = shmget(key,size,shmflgs); 
... 
void* address_of_my_shm1 = shat(my_shmid,0,shmflags); 

Object* optr = static_cast<Object*>(address_of_my_shm1); 

...或者,在一些其他線程/進程,你安排一些其他方法

void* address_of_my_shm2 = shat(my_shmid,address_of_my_shm1,shmflags); 

您可能想要斷定address_of_shm1 == address_of_shm2傳遞address_of_my_shm1 ...。但請注意,我說「可能」 - 你實際上並不需要這樣做。某些類型/結構體/類可以在不同的地址同等閱讀。

如果對象出現在不同的地址空間中,那麼在進程A中shhm之外的指針可能不會指向與進程B中相同的東西。通常,shm之外的指針是不好的。 (虛擬函數是指向對象之外的指針,除了shm外,壞,除非您有其他理由相信它們。)

如果shm內的指針出現在相同的地址處,則它們可用。

相對指針可能相當有用,但是,只要它們只指向shm內部即可。相對指針可以相對於對象的基礎,即它們可以是偏移量。或者它們可能與指針本身有關。你可以定義一些很好的類/模板來完成這些計算,並在後臺進行投射。通過SHMEM對象

共享是最簡單的,如果數據只是POD(普通舊數據)。沒有什麼花哨。

因爲你是指在沒有被共享整個地址空間不同的過程,則可能不能保證的事情等虛函數將出現在使用SHM共享存儲器段的所有進程相同的地址。所以最好避免虛擬功能。 (如果您努力嘗試和/或知道鏈接,您可能在某些情況下可以共享虛擬功能,但這是我必須禁用的第一件事情之一,如果我必須調試。)

您應該只做這個如果你知道你的實現的對象內存模型。如果先進的(對於C++)優化,比如將結構拆分成不連續的熱部分和冷部分,則會被禁用。由於這種優化可能對C++來說不合法,因此您可能是安全的。

很顯然,如果您在所有方面都轉換爲相同的對象類型/類,那麼效果會更好。 你可以逃脫非虛擬功能。然而,請注意,擁有相同的類可能相當容易,但是類的不同版本 - 例如大小不同,例如添加一個新字段並更改所有其他字段的偏移量 - 所以您需要非常小心以確保所有方都使用相同的定義和聲明。