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
Powered by: 博客园 Copyright © 2024 lovewcl Powered by .NET 9.0 on Kubernetes