3

stl ベクトルは SYS V 共有メモリではうまく機能しないことを読みました。しかし、POSIX shm_open を使用してから NULL (mmap(NULL, LARGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) で mmap を使用し、ベクトルを含むオブジェクトよりもはるかに大きなサイズを指定し、マッピング後に追加のアイテムを追加すると、ベクトル、LARGE_SIZE スペースを超える以外に問題はありますか? その他の関連する質問: 最近の SUSE Linux では、関連のないプロセスで (上記の構文を使用して) 同じ開始アドレスにマップされた場合、オブジェクトが直接マップされ、プロセスで変更された値を実現するために (システム) コピーは実行されません (通常のオープン ファイルと通常のファイルを mmap したときに何が起こるかなど)? ありがとう!

編集:これは正しいですか?:

void* mem = allocate_memory_with_mmap(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );
ptr.~MyType() //is this really needed?

現在、無関係なプロセスにあります:

MyType* myptr = (MyType*)fetch_address_from_mmap(...)
myptr->printHelloWorld();
myptr->myvalue = 1; //writes to shared memory
myptr.~MyType() //is this really needed?

メモリを解放したい場合

munmap(address...) //but this done only once, when none of the processes use it any more
4

1 に答える 1

4

STL ベクトルは通常 のタプルであり(mem pointer, mem size, element count)、含まれるオブジェクトの実際のメモリはallocatorテンプレート パラメータから取得されるという事実を見逃しています。

のインスタンスをstd::vector共有メモリに配置しても意味がありません。boost::interprocess代わりにライブラリをチェックアウトすることをお勧めします。

編集 0:

メモリの割り当てとオブジェクトの構築は、次のように 1 つのステートメントに結合されますが、2 つの異なるフェーズです ( operatornewが に対して再定義されない限りMyType)。

// allocates from process heap and constructs
MyType* ptr = new MyType( args );

これらの 2 つのフェーズは、placement newで分割できます。

void* mem = allocate_memory_somehow(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );

ただし、デストラクタを明示的に呼び出してメモリを解放する必要があります。

ptr->~MyType();
release_memory_back_to_where_it_came_from( ptr );

これは基本的に、C++ で共有メモリ内にオブジェクトを構築する方法です。ただし、ポインタを格納する型は共有メモリには適していないことに注意してください。これは、一方のプロセス メモリ空間内のポインタは他方のプロセス メモリ空間では意味をなさないためです。代わりに明示的なサイズとオフセットを使用してください。

お役に立てれば。

于 2012-09-26T14:37:38.350 に答える