共有メモリとして使用する構造内にキューのような構造を作成する必要があります。これどうやってするの ?私のコンパイラは Visual C++ です。
2 に答える
共有メモリ内で複雑な C++ オブジェクトを使用することは、私が恐れているほど単純ではありません。2 つのことを考慮する必要があります。
1)
スタックではなく、共有メモリ領域にクラス インスタンスを作成する必要があります。これは、placement new 演算子を使用して行うことができます。例:
#include <new> // for placement new operator
class X
{
// whatever
};
// suppose this points to some shared memory area
void *shared_mem = getSharedMem();
// this creates an instance of X at the start address of shared_mem
new(shared_mem) X;
// now you have a reference to an instance of X in the shared memory area
X& shared_x = *reinterpret_cast<X*>(shared_mem);
ただし、共有メモリ内でそのオブジェクトを構築する責任を負うプロセスは 1 つだけであることに注意してください。また、参加している他のプロセスには、オブジェクトがすでに正しく初期化されており、安全にアクセスできるかどうかを知る手段が必要です。アクセスには、ある種のプロセス間ロックも必要です (たとえば、Win32 では名前付きミューテックス)。
2)
キュー データ構造の場合のように、クラス タイプが動的メモリを必要とする場合、ヒープは 1 つのプロセスに対してローカルであるため、通常のようにヒープからメモリを取得することはできません。STL キュー コンテナーを使用する場合は、ヒープではなく共有メモリからメモリを取得する独自の STL アロケータ クラスを実装できます。
使用されるアロケータ クラスは、STL テンプレート宣言の一部です。たとえば、std::deque<T, A> の場合、A はアロケーターの型です。デフォルトでは、ヒープからメモリーを取得する標準の STL アロケーターが使用されます。
カスタム共有メモリ アロケータは、どの共有メモリ アドレスから正確にメモリを割り当てることができるかを知る必要があります。ほとんどの STL 実装でのアロケーターのサポートは、(私の知る限り) アロケーターのインスタンスごとのデータではうまく機能しないため、共有メモリを取得する場所を知ることができるように、アロケーターにグローバル/静的データが必要になる可能性があります。から。
全体として、1) で説明したように、共有メモリで動作する単純なカスタム キュー クラスを作成する方がよい場合があります。キュー クラスが静的サイズのメモリを使用するようにすることができます。たとえば、キュー内に正確に 100 個のオブジェクトのスペースを保持できます。この制限を超えると、操作は失敗します。
- ミューテックスを使用して、データ型やクラスが何であれ、共有メモリを保護します。データがどれほど複雑であっても問題ありません。また、ミューテックスの仕組みとウィキペディアのスレッドの記事についてもお読みください。共有データはヒープまたはグローバル変数として存在する必要がありますが、スタック上、つまりローカル変数ではありません。
- データへのすべてのアクセスについて、次のことを行う必要があります。
- ロックミューテックス
- データのコピーアウトまたはデータへの書き込み (ここであまり時間をかけないでください)
- ミューテックスを解放する
- データを使用する (コピーした場合)
- スレッドとミューテックスに、軽量でオープン ソースのマルチプラットフォーム C++ ライブラリを使用しますか? TinyThread++を試してください。そのライセンスは商用利用にも適しており、無料で許可されています。3つのファイルのみで構成されています。使用方法についてはドキュメントを参照してください。C バージョンはTinyCThreadです。