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.javaeye.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. }
編譯
deepfuture@deepfuture-laptop:~/private/mytest$ gcc -lpthread -std=c99 -lrt -o testmutex testmutex.c
執行
deepfuture@deepfuture-laptop:~/private/mytest$ ./testmutex x+=2:2 x++:3 x+=2:5 x++:6 x+=2:8 x++:9 x+=2:11 x++:12 x+=2:14 x++:15 x+=2:17 x++:18 x+=2:20 x++:21 x+=2:23 x++:24 x+=2:26 x++:27 x+=2:29 x++:30
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。