linux下线程锁的应用

  1. #include <sys/stat.h>     
  2. #include <fcntl.h>     
  3. #include <sys/mman.h>     
  4. #include <unistd.h>     
  5.     
  6.     
  7. #include <pthread.h>     
  8. #include <stdio.h>     
  9. #include <stdlib.h>     
  10.     
  11.     
  12.     
  13.     
  14. int main(void){//2个进程,一个进程完成每次加1,另一个进程完成每次加2,2个进程协作完成累加,使用共享内存方式在进程间通信     
  15.     
  16. int *x;     
  17. int rt;     
  18. int shm_id;     
  19. char *addnum="myadd";     
  20. char *ptr;     
  21.     
  22. pthread_mutex_t mutex;//互斥对象     
  23. pthread_mutexattr_t mutexattr;//互斥对象属性     
  24.     
  25.     
  26.    pthread_mutexattr_init(&mutexattr);//初始化互斥对象属性     
  27.    pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_SHARED);//设置互斥对象为PTHREAD_PROCESS_SHARED共享,即可以在多个进程的线程访问,PTHREAD_PROCESS_PRIVATE为同一进程的线程共享     
  28.    rt=fork();//复制父进程,并创建子进程      
  29. //deepfuture.iteye.com,深未来技术原创     
  30.    if (rt==0){//子进程完成x+1     
  31.        shm_id=shm_open(addnum,O_RDWR,0);     
  32.        ptr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/    
  33.        x=(int *)ptr;       
  34.        
  35.       for (int i=0;i<10;i++){//加10次。相当于加10     
  36.        pthread_mutex_lock(&mutex);           
  37.        (*x)++;     
  38.        printf("x++:%d\n",*x);     
  39.        pthread_mutex_unlock(&mutex);      
  40.        sleep(1);                      
  41.       }     
  42.    }        
  43.    else{//父进程完成x+2     
  44.        shm_id=shm_open(addnum,O_RDWR|O_CREAT,0644);     
  45.         ftruncate(shm_id,sizeof(int));     
  46.         ptr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/    
  47.         x=(int *)ptr;      
  48.                
  49.       for (int i=0;i<10;i++){//加10次,相当于加20     
  50.        pthread_mutex_lock(&mutex);            
  51.        (*x)+=2;     
  52.        printf("x+=2:%d\n",*x);     
  53.        pthread_mutex_unlock(&mutex);       
  54.        sleep(1);      
  55.       }           
  56.            
  57.    }      
  58.    shm_unlink(addnum);//删除共享名称     
  59.    munmap(ptr,sizeof(int));//删除共享内存     
  60.    return(0);     
  61. }    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值