【问题标题】:PThread robust mutex not workingPThread 强大的互斥锁不起作用
【发布时间】: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;
}   

【问题讨论】:

    标签: c++ pthreads shared-memory interprocess


    【解决方案1】:

    你有两个相关的问题:

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

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

    【讨论】:

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