2

私のプログラムには 2 つのスレッドがあり、共有メモリを使用して 2 つの間の通信を行っています。

各スレッドには「init」メソッドがあります。init メソッドでは、「shmget」と「shmat」を呼び出して共有メモリ セグメントを取得し、ローカル変数にアタッチします。コードの一部は次のようになります。

Thread 1 (which runs first):

void init() {
  this->segment_id = shmget(SAME_KEY,SAME_SIZE,IPC_CREAT|S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH);
  this->data       = shmat(this->segment_id,0,0);
}

Thread 2 (which runs after thread 1):

void init() {
  this->segment_id = shmget(SAME_KEY,SAME_SIZE,0);
  this->data       = shmat(this->segment_id,0,0);
}

プログラムは実行されていますが、予期しない結果が生じます。私が恐れているのは、2 番目のスレッドで「shmat」を呼び出すと、スレッド 1 の「データ」にアクセスできなくなるか、何らかの誤動作が発生する可能性があることです。実際には、スレッド 1 では共有セグメント全体にアクセスできますが、スレッド 2 では最初の 16 バイトしかアクセスできないため、何が起こっているのかわかりません。

これは、各共有メモリ セグメントを一度に 1 つの場所に接続できるということですか? 異なるポインタから共有メモリにアクセスできるようにするために、「shmat」を 2 回呼び出しても問題ありませんか?

4

1 に答える 1

2

各共有メモリ セグメントは、一度に複数の場所に接続できます。'shmat' を 2 回呼び出して、異なるポインターから共有メモリーにアクセスできるようにすることは問題ありません。

与えられた例では、Thread1::init() が Thread2::init() の前に呼び出されていることを確認できないため、Thread2 では作成されていないメモリにアクセスしていると思われます。これが、観察された問題の理由です。

両方の呼び出しに IPC_CREAT を使用します (もちろん IPC_EXCL は使用しません)。

マンページを参照

于 2012-08-28T08:02:53.647 に答える