PThread 强大的互斥锁不起作用

Posted

技术标签:

【中文标题】PThread 强大的互斥锁不起作用【英文标题】:PThread robust mutex not working 【发布时间】:2015-06-10 05:18:53 【问题描述】:

对于进程间程序,当一个进程获得互斥锁并且该进程被用户杀死时,该锁永远不会被解锁,而另一个正在等待获得相同锁的进程只会继续等待。

我进行了广泛的搜索,发现pthreads 具有robust lock 的概念来解决问题,但在尝试时,进程之间的普通锁定本身不起作用。 对于下面的代码,我打开了两个终端并在两个终端中运行了可执行文件。 在这两种情况下,程序都立即获得了锁。预期的行为是我运行的第一个可执行文件将获取锁,而第二个可执行文件将等待 30 秒。但这不会发生。我实施错了吗? (用-lpthread编译)

#include <pthread.h>
#include<iostream>

pthread_mutex_t shm_mutex;

int main(void)

    int err;
    pthread_mutexattr_t mattr;
    std::cout<<"Beginning\n";


    err = pthread_mutexattr_init(&mattr); if (err) return err;
    err = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); if (err) return err;
    err = pthread_mutex_init(&shm_mutex, &mattr); if (err) return err;
    err = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);


    std::cout<<"Before locking\n";
    //err = pthread_mutexattr_destroy(&attr); if (err) return err;
    err = pthread_mutex_lock(&shm_mutex); if (err) return err;
    std::cout<<"locked\n";

    sleep(30);

    err = pthread_mutex_unlock(&shm_mutex); if (err) return err;
    std::cout<<"Unlocked\n";
    err = pthread_mutex_destroy(&shm_mutex); if (err) return err;

    return 0;
   

【问题讨论】:

【参考方案1】:

你有两个相关的问题:

    第二个进程在互斥体上调用pthread_mutex_init,将其销毁,因为它已被第一个进程创建锁定

    您实际上并没有通过将互斥体放入共享内存来共享互斥体。您让每个进程在自己的地址空间中创建自己的互斥体。

【讨论】:

那么互斥锁是如何放入公共共享内存的呢?我已经尝试了很多。即使在这个程序(redhat.com/archives/phil-list/2003-June/msg00000.html)中,分叉的进程也会通过pthread_rwlock_init @Nav 他们可以映射同一个文件。您可以在fork 之前创建共享映射。您可以使用shm_open 来使用SysV 共享内存。但是你需要以某种方式在共享内存中创建一个互斥体。

以上是关于PThread 强大的互斥锁不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++ 互斥锁不起作用 - 同步失败

添加到地图的类中的互斥锁不起作用c ++

互斥锁不工作

linux下互斥锁mutex,貌似锁不上呢

pthread_sigmask 在信号处理程序中不起作用

Linux:pthread_cond_signal() 在 Signal Handler() 中不起作用