在两个进程之间同步访问共享内存中的数据

时间:2016-06-17 21:39:21

标签: c synchronization ipc shared-memory

我有两个在共享内存中有数据的进程。这些数据将通过这两个过程进行更新。我正在寻找两个进程之间的一些锁定机制。使用线程很容易拥有共享的互斥锁。在我的例子中,我试图将互斥变量保存在共享内存中,然后两个进程都会使用它来锁定。但这并没有奏效。如何在两个进程之间共享互斥锁。有人说互斥量不能共享,使用信号量。为什么不能共享互斥锁,但信号量可以是?

1 个答案:

答案 0 :(得分:3)

有可能,您必须使用标志PTHREAD_PROCESS_SHARED:

pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);


// Init the shared mem barrier
if ( (rv = pthread_mutex_init(&nshared, &mattr)) != 0 ) {
      fprintf(stderr, "Failed to initiliaze the shared mutex.\n");
      return rv;
}

变量nshared映射到共享内存中。

看看这个documentation。另外,请记住,互斥锁的默认值是不在进程间共享它。

另外,请查看这些帖子post1 post2

用于破坏互斥锁状态的红利代码:

void showPshared(pthread_mutexattr_t *mta) {
  int           rc;
  int           pshared;

  printf("Check pshared attribute\n");
  rc = pthread_mutexattr_getpshared(mta, &pshared);

  printf("The pshared attributed is: ");
  switch (pshared) {
  case PTHREAD_PROCESS_PRIVATE:
    printf("PTHREAD_PROCESS_PRIVATE\n");
    break;
  case PTHREAD_PROCESS_SHARED:
    printf("PTHREAD_PROCESS_SHARED\n");
    break;
  default :
    printf("! pshared Error !\n");
    exit(1);
  }
  return;
}

我不记得我拿了这段代码......发现了! here是知识的来源。