在共享内存中管理互斥锁

时间:2012-10-02 00:28:40

标签: c concurrency mutex

我正在尝试在共享内存中创建互斥锁的简单任务。我有以下代码来声明共享内存的一部分,并将其附加到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;

现在,我尝试定义一个关键部分,包围锁定和解锁互斥锁。 (在许多子进程中的一个内部。)

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

// critical section

...

// end critical section

mutex[0] = 1;

但是,我发现这种技术不起作用,两个子进程可以同时进入临界区,没有太多问题(经常发生)。所以我想知道如何在不使用pthreads的情况下解决这个问题。

1 个答案:

答案 0 :(得分:5)

您的选择是:

  1. 使用POSIX信号量而不是尝试使用共享内存自旋锁实现它们。有关详细信息,请参阅semop (2)及相关功能的文档。

  2. 如果必须使用共享内存信号量,则需要使用原子比较/交换。否则,两个进程可以同时查看*mutex == 0并同时将其设置为1,而不会“注意到”其他进程正在执行相同的操作。