鲁棒互斥锁不适用于共享内存

问题描述 投票:0回答:1

我正在使用内存共享互斥锁的实现,可在此处找到:https://gist.github.com/yamnikov-oleg/abf61cf96b4867cbf72d

我担心如果拥有锁的进程崩溃,则该互斥锁的所有权会受到影响。从我的测试看来,其他进程将无法获得锁。我在搜索时发现了健壮的互斥锁的概念,并通过更改此部分来修改了代码:

  // If shared memory was just initialized -
  // initialize the mutex as well.
  if (mutex.created) {
    pthread_mutexattr_t attr;
    if (pthread_mutexattr_init(&attr)) {
      perror("pthread_mutexattr_init");
      return mutex;
    }
    if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) {
      perror("pthread_mutexattr_setpshared");
      return mutex;
    }
    if (pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST)) { //Added this portion.
      perror("pthread_mutexattr_setrobust");
      return mutex;
    }
    if (pthread_mutex_init(mutex_ptr, &attr)) {
      perror("pthread_mutex_init");
      return mutex;
    }
  }

使用这些文件的代码是:

  shared_mutex_t mutex = shared_mutex_init("/my-mutex");

  if (mutex.ptr == NULL) return 1;

  if (mutex.created) printf("The mutex was just created\n");
  int i = 0;
  while(1) {
    int trylock = pthread_mutex_trylock(mutex.ptr);
    printf("Try lock: %d\n", trylock);
    if (trylock != 0) continue;

    printf("I'm in\n");

    if (i == 5) {
      return 1 / 0;
    }

    sleep(5);    
    pthread_mutex_unlock(mutex.ptr);
    sleep(1);

    i++;
    if (i == 10) {
      break;
    }
  }

为了进行测试,我运行了该程序的两个实例,并观察了它们之间传递的锁所有权。当i == 5时,程序将中断,并且应从我从健壮的互斥体中读取的内容中将所有权传递给下一个锁定调用。

但是,似乎没有任何改变,其行为与我改变任何事物之前相同。关于如何进行的任何想法?预先感谢。

c pthreads posix mutex shared-memory
1个回答
0
投票

Documentation says

如果互斥锁是健壮的互斥锁,并且拥有线程终止,而按住互斥锁,可能会返回对pthread_mutex_lock()的调用错误值[EOWNERDEAD]即使在其中拥有的进程线程驻留尚未终止。在这种情况下,互斥锁被锁定线程将其保护的状态标记为不一致。应用程序应确保状态保持一致重用,并在完成后调用pthread_mutex_consistent()。如果应用程序无法恢复状态,因此应解锁互斥体,在此之后没有事先调用pthread_mutex_consistent()互斥体被标记为永久不可用。

您没有正确处理[OWNERDEAD]返回码。

© www.soinside.com 2019 - 2024. All rights reserved.