5进程间锁:进程间pthread_mutex,文件锁
1進程間pthread_mutex
A依賴的頭文件
#include<pthread.h>
B函數聲明
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
?
關于pshared可供選的參數:
線程鎖:PTHREAD_PROCESS_PRIVATE
進程鎖:PTHREAD_PROCESS_SHARED
默認情況下是線程鎖
C案例說明:
| #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <sys/mman.h> #include <string.h> #include <sys/wait.h> ? struct mt { ???int num; ???pthread_mutex_t mutex; ???pthread_mutexattr_t mutexattr; }; ? int main(void) { ???int fd,i,err; ???struct mt *mm; ???pid_t pid; ? ???fd = open("mt_test",O_CREAT|O_RDWR,0777); ???/*不需要write,文件里初始值為0*/ ???ftruncate(fd,sizeof(*mm)); ???mm = mmap(NULL,sizeof(*mm),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); ???close(fd); ? ???memset(mm,0,sizeof(*mm)); ? ???/*初始化互斥對象屬性*/ ???pthread_mutexattr_init(&mm->mutexattr); ? ???/* ????* 設置互斥對象為PTHREAD_PROCESS_SHARED共享,即可以在多個進程的 ????*線程訪問,PTHREAD_PROCESS_PRIVATE為同一進程的線程共享 ????*/ ???pthread_mutexattr_setpshared(&mm->mutexattr,PTHREAD_PROCESS_SHARED); ? ???pthread_mutex_init(&mm->mutex,&mm->mutexattr); ? ???pid = fork(); ???if(pid == 0) { ???????/*加10次。相當于加10*/ ???????for(i = 0;i < 10;i++) { ???????????//在子進程上對文件進行上鎖 ???????????pthread_mutex_lock(&mm->mutex); ???????????(mm->num)++; ???????????printf("num++:%d\n",mm->num); ???????????//解鎖 ???????????pthread_mutex_unlock(&mm->mutex); ???????????sleep(1); ???????} ???} else if(pid > 0) { ???????/*父進程完成x+2,加10次,相當于加20*/ ???????for (i = 0;i < 10;i++) { ???????????pthread_mutex_lock(&mm->mutex); ???????????mm->num += 2; ???????????printf("num+=2:%d\n",mm->num); ???????????pthread_mutex_unlock(&mm->mutex); ???????????sleep(1); ???????} ???????wait(NULL); ???} ? ???err = pthread_mutex_destroy(&mm->mutex); ???if(err != 0) { ???????printf("%s\n",strerror(err)); ???} ? ???/* 父子均需要釋放 */ ???munmap(mm,sizeof(*mm)); ???unlink("mt_test"); ???return 0; } |
運行結果:
總結:
a進程間通信,可以通過內存映射的方式對文件進行操作。
b在上鎖的情況下,數字相加后最后得到的是30,加鎖后沒有出現沖突。
2文件鎖
???使用fcntl提供文件鎖
struct flock {
???….
???short l_type;??? /*Type of lock:F_RDLCK,F_WRLCK,F_UNLCK*/
???short l_whence;? /*How to interpretl_start:SEEK_SET,SEET_CUR,SEEK_END*/
???off_t l_start;???? /*Starting offset for lock*/
???off_t l_len;????? /*Number of bytes to lock*/
???pid_t l_pid;????? /*PID of process blocking ourlock(F_GETLK only)*/
???….
};
案例說明:
| #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> ? void sys_err(char *str) { ???perror(str); ???exit(1); } ? int main(int argc,char *argv[]) { ???int fd; ???struct flock f_lock; ???if(argc < 2) { ???????printf("./a.out filename\n"); ???????exit(1); ???} ? ???if((fd = open(argv[1],O_RDWR)) < 0) { ???????sys_err("open"); ???} ???//f_lock.l_type = F_WRLCK ???f_lock.l_type = F_WRLCK; ???f_lock.l_whence = SEEK_SET; ???f_lock.l_start = 0; ???f_lock.l_len = 0;? //0表示整個文件加鎖 ??? ???fcntl(fd,F_SETLKW,&f_lock); ???printf("get flock\n"); ???sleep(10); ???f_lock.l_type = F_UNLCK; ???fcntl(fd,F_SETLKW,&f_lock); ???printf("un flock\n"); ? ???close(fd); ???return 0; } |
運行結果:
現象說明:當一個終端在運行的時候,同時打開另外一個終端,同時也執行./app test時發現開始的10秒內不允許操作,現象是test文件被鎖住了。也就是說不能同時操作這個文件。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的5进程间锁:进程间pthread_mutex,文件锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么电脑不显示u盘 电脑为什么无法显示U
- 下一篇: 1.socket编程:socket编程,