C中的共享内存互斥错误

时间:2017-09-13 14:19:07

标签: c mutex shared-memory

运行此代码时,互斥锁(存储在进程之间的共享内存中)允许打印运行两次。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/wait.h>
#include <sys/mman.h>

int main(){
    int* shared = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
    pthread_mutex_t* mutex = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);

    int cores = 2;
    int is_son = 0;
    for (int core=0; core<cores; core++){
        if (!fork()){   // is son
            is_son++;
            printf("new son\n");
            break;
        }
    }
    if (is_son){    // only run if is son
        printf("got here\n");
        pthread_mutex_lock(mutex);
        if (!*shared){
            *shared = 1;
            printf("is in (should only print once)\n");
        }
        pthread_mutex_unlock(mutex);
        printf("left\n");
    }
    return 0;
}

错误行为的输出示例: Example output of wrong behaviour

代码说明: 我们在共享内存中存储一​​个名为shared和mutex的布尔值。 创建了两个从属进程。两者都试图运行打印功能,但只允许一个这样做。 互斥锁在那里,因此一次只能有一个人输入受保护的代码,并将共享的值更改为1,以便下一个进入。

0 个答案:

没有答案