对于进程间程序,当进程获取互斥锁并且进程被用户终止时,锁永远不会被解锁,而另一个等待获取相同锁的进程只是在等待。
我进行了广泛的搜索,发现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;
}
答案 0 :(得分:2)
您有两个相关问题:
第二个进程在互斥锁上调用了pthread_mutex_init
,它会破坏它,因为它已经被第一个进程和 锁定。< / p>
您通过将互斥锁放在共享内存中实际上共享互斥锁。您让每个进程在自己的地址空间中创建自己的互斥锁。