1

共有メモリにミューテックスを作成するという簡単な作業を試みています。共有メモリのセクションを宣言し、int*.

int *mutex;

// allocate shared memory for mutex
if ((shmid2 = shmget(IPC_PRIVATE, 4, IPC_CREAT | 0666)) < 0) {
  printf("Could not allocate shared memory for mutex: %d.\n", errno);
  exit(errno);
}

if ((mutex = shmat(shmid2, NULL, 0)) == (int*)-1) {
  printf("Could not attach shared memory for mutex: %d\n", errno);
  exit(errno);
}

// set the mutex to one
mutex[0] = 1;

ここで、ミューテックスのロックとロック解除に囲まれたクリティカル セクションを定義しようとしています。(多くの子プロセスの 1 つの内部)。

while (*mutex == 0) ;
mutex[0] = 0;

// critical section

...

// end critical section

mutex[0] = 1;

ただし、この手法は機能せず、2 つの子プロセスが同時に重要なセクションに入ることができますが、問題はほとんどありません (非常に頻繁に発生します)。したがって、pthreads を使用せずに、これを修正するために何ができるのか疑問に思っています。

4

1 に答える 1

5

オプションは次のとおりです。

  1. 共有メモリのスピンロックを使用して自分で実装しようとする代わりに、POSIX セマフォを使用してください。semop (2)詳細については、および関連する関数のドキュメントを参照してください。

  2. 共有メモリ セマフォを使用する必要がある場合は、アトミックな比較/交換を使用する必要があります。そうしないと、2 つのプロセスが、他のプロセスが同じことをしていることに「気付かない」ことなく、同時に*mutex == 0それを認識して設定することができます。1

于 2012-10-02T00:33:47.393 に答える