您的位置:首页 > 运维架构 > Linux

linux-多线程-互斥锁在多进程共享

2011-03-03 18:36 323 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: