PThread强大的互斥无法正常工作

时间:2015-06-10 05:18:53

标签: c++ pthreads shared-memory interprocess

对于进程间程序,当进程获取互斥锁并且进程被用户终止时,锁永远不会被解锁,而另一个等待获取相同锁的进程只是在等待。

我进行了广泛的搜索,发现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 个答案:

答案 0 :(得分:2)

您有两个相关问题:

  1. 第二个进程在互斥锁上调用了pthread_mutex_init,它会破坏它,因为它已经被第一个进程 锁定。< / p>

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