Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1252771
  • 博文数量: 177
  • 博客积分: 1528
  • 博客等级: 上尉
  • 技术积分: 1891
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 18:03
文章分类

全部博文(177)

文章存档

2020年(1)

2018年(19)

2017年(4)

2016年(21)

2015年(40)

2014年(13)

2013年(26)

2012年(16)

2011年(37)

我的朋友

分类: LINUX

2014-07-23 15:58:34


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


编译


  1. deepfuture@deepfuture-laptop:~/private/mytest$ gcc  -lpthread -std=c99 -lrt -o testmutex testmutex.c  


执行


  1. deepfuture@deepfuture-laptop:~/private/mytest$ ./testmutex  
  2. x+=2:2  
  3. x++:3  
  4. x+=2:5  
  5. x++:6  
  6. x+=2:8  
  7. x++:9  
  8. x+=2:11  
  9. x++:12  
  10. x+=2:14  
  11. x++:15  
  12. x+=2:17  
  13. x++:18  
  14. x+=2:20  
  15. x++:21  
  16. x+=2:23  
  17. x++:24  
  18. x+=2:26  
  19. x++:27  
  20. x+=2:29  
  21. x++:30  


阅读(1467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~