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++) {
mm->num += 2;
printf("num+=2:%d\n",mm->num);
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;
printf("un flock\n");
現象說明:當一個終端在運作的時候,同時打開另外一個終端,同時也執行./app test時發現開始的10秒内不允許操作,現象是test檔案被鎖住了。也就是說不能同時操作這個檔案。