进程间同步之mutex锁

进制间同步机制之mutex

1. Mutex锁可以用于进程间互斥?  当然可以。

a) 使用pthread_mutex_t 来实现进程间的互斥。

b) 当必须支持PTHREAD_PROCESS_SHARED属性

c)其中设置共享对象的属性为PTHREAD_PROCESS_SHARED是为了告诉系统该共享对象是跨越进程的,不仅仅对创建它的进程可见;但是仅有这一个条件显然无法满足不同进程使用该同步对象的需求,因为每个进程的地址空间是独立的,位于一个进程的普通内存区域中的对象是无法被其它进程所访问的,能满足这一要求的内存区域是共享内存,因而同步对象要在进程的共享内存区域内创建。

举例来实现

 

#include <pthread.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
        pthread_mutex_t  *pm_mutex = NULL;
        pthread_mutexattr_t mutex_shared_attr;
        int *p_shared = NULL;
        pid_t pid;
        //为什么要用mmap映射一个空间呢,因为mmap可以进程间共享内存
        pm_mutex = (pthread_mutex_t *)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,
                                                MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        p_shared = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
                                                MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        *p_shared = 0;

        pthread_mutexattr_init(&mutex_shared_attr);
        pthread_mutexattr_setpshared(&mutex_shared_attr, PTHREAD_PROCESS_SHARED);
        pthread_mutex_init(pm_mutex, &mutex_shared_attr);

        pid = fork();
        if(pid ==0)
        {
                pthread_mutex_lock(pm_mutex);
                for (int i = 0; i< 5; i++)
                {
                        (*p_shared)++;
                        sleep(1);
                        printf("child process value is: %d\n", *p_shared);
                }
                pthread_mutex_unlock(pm_mutex);
                return 0;
        }else{
                pthread_mutex_lock(pm_mutex);
                                                                                                                                     31,14-35       6%

猜你喜欢

转载自blog.csdn.net/u012385733/article/details/80057461
今日推荐