天天看點

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++) {

           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;

}

運作結果:

5程式間鎖:程式間pthread_mutex,檔案鎖

總結:

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");

5程式間鎖:程式間pthread_mutex,檔案鎖

現象說明:當一個終端在運作的時候,同時打開另外一個終端,同時也執行./app test時發現開始的10秒内不允許操作,現象是test檔案被鎖住了。也就是說不能同時操作這個檔案。