实现进程之间上锁有多种方式,可以用文件锁,但文件锁要涉及到文件系统,十分耗时。其实进程之间也可以用线程锁,因为线程锁不仅可以用于线程之间同样可以用于进程之间。
为了在多个进程之间使用线程锁,必须做到(1)互斥锁变量必须存储在为所有进程所共享的内存中;(2)必须通知线程函数库互斥锁是在不同进程之间共享的。
针对第一条,必须将互斥锁放到共享内存中,不同进程共享内存有多种方式,在此我们使用mmap函数和/dev/zero设备。例如以下函数:
static pthread_mutex_t *mptr;
void my_lock_init(char * pathname)
{
int fd;
pthread_muteattr_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_muteattr_setpshared(&mattr,PTHREAD_PROCESS_SHARED);
pthread_mutex_init(mptr,&mattr);
}
首先打开/dev/zero,并调用mmap,映射的字节数为pthread_mutex_t类型大小。紧接着关闭文件,这里不会有问题,因为描述字已经内存影射了。
在共享内存里创建的互斥锁必须用pthread_mutexattr_init函数来动态初始化,然后赋予PTHREAD_PROCESS_SHARED属性,本属性的缺省值是PTHREAD_PROCESS_PRIVATE,只允许单个进程内使用。。最后使用pthread_mutex_init初始化互斥锁变量。支持进程间使用线程锁的初始工作全部完成,可以使用了,如下:
pthread_mutex_lock(mptr);
pthread_mutex_unlock(mptr);