初始化一互斥锁,以便在进程之间共享。这就要求互斥锁必须位于共享内存区,并且必须分配该互斥锁的共享空间大小为sizeof(pthread_mutex_t).设置互斥锁的属性为PTHREAD_PROCESS_SHARED,并初始化互斥锁。
第一个进程调用
void process1_lock_init()
{
int fd;
pthread_mutexattr_t mattr;
fd=open("/dev/zero", O_RDWR, 0);
mptr=mmap(0, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(mptr, &mattr);
}
其它进程调用
void process2_lock_init()
{
int fd;
pthread_mutexattr_t mattr;
fd=open("/dev/zero", O_RDWR, 0);
mptr=mmap(0, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
}
上锁
void my_lock_wait()
{
pthread_mutex_unlock(mptr);
}
解锁
void my_lock_release()
{
pthread_mutex_unlock(mptr);
}
当在进程间共享一个互斥锁时,持有该互斥锁的进程在持有期间终止(也许非自愿),这时没有办法让系统在进程终止时自动释放所持有的锁。(读写锁和posix信号量也具备这种属性)。
进程在终止时总是自动清理的唯一同步锁类型是fcntl记录锁。
使用system V信号量时,应用程序可以选择在进程终止时内核是否自动清理某个信号量锁(SEM_UNDO特性)
注:即使一个进程终止时系统会自动释放某个锁,也可能是存在问题的。该锁保护某个临界区很可能是为了在执行该临界区代码期间更新某个数据,如果该进程在执行临界区的中途终止,那么这数据处于不一致状态的可能性比较大。
阅读(1223) | 评论(0) | 转发(0) |