私のプログラムには 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 回呼び出しても問題ありませんか?