日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5进程间锁:进程间pthread_mutex,文件锁

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,文件锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。