Scanf 在使用互斥量的多处理中不能正常工作

Scanf doesn't work properly in multiprocessing with mutex

我将程序与在父子进程之间共享的互斥锁同步,但它的工作方式不如我预期,我期望:我输入 num 然后输出它,对于另一个进程相同,但只工作一个进程。

最小代码示例:

#include <stdio.h>
#include <stdlib.h>
// for multiprocessing
#include <unistd.h>
#include <sys/wait.h>
// for shared mutex
#include <pthread.h>
#include <sys/mman.h>

pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;

int main()
{
    pthread_mutex_t *shared_mutex;
    pthread_mutexattr_init(&mutexattr);
    pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(&mutex, &mutexattr);
    shared_mutex = (pthread_mutex_t *)mmap(NULL, sizeof(mutex), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);

    int pid = fork();
    if (pid == -1) {
        perror("fork() failed\n");
        exit(1);
    }
    if (pid == 0) {
        int num;
        pthread_mutex_lock(shared_mutex);
        printf("enter num for child: ");
        scanf("%d", &num);
        pthread_mutex_unlock(shared_mutex);

        pthread_mutex_lock(shared_mutex);
        printf("num in child: %d\n", num);
        pthread_mutex_unlock(shared_mutex);

        return 0;
    } else {
        int num;
        pthread_mutex_lock(shared_mutex);
        printf("enter num for parent: ");
        scanf("%d", &num);
        pthread_mutex_unlock(shared_mutex);

        pthread_mutex_lock(shared_mutex);
        printf("num in parent: %d\n", num);
        pthread_mutex_unlock(shared_mutex);

        wait(NULL);
    }

    pthread_mutexattr_destroy(&mutexattr);
    pthread_mutex_destroy(&mutex);
    munmap(shared_mutex, sizeof(mutex));

    return 0;
}

在运行时它无限工作:

您没有跨进程共享实际的 mutex 互斥体。相反,您正在共享一个不是互斥锁的零初始化内存块。

这段代码创建了一个名为 mutex 的互斥锁,它是 main():

中的一个局部变量
pthread_mutexattr_init(&mutexattr);
pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&mutex, &mutexattr);

这段代码创建了一个完全不相关的共享内存块,其中包含一堆零初始化的字节,与任何互斥量,尽管 shared_mutex 指针变量的名称和类型:

pthread_mutex_t *shared_mutex;
    .
    .
    .
shared_mutex = (pthread_mutex_t *)mmap(NULL, sizeof(mutex),
    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);

这两个内存区域除了是同一个进程中的内存之外,没有任何关系。 mutex 指的是 main() 的本地互斥体。 shared_mutex指的是一堆零。

需要在共享内存中创建互斥量:

pthread_mutex_t *shared_mutex;
pthread_mutexattr_init(&mutexattr);
pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED);
shared_mutex = (pthread_mutex_t *)mmap(NULL, sizeof(mutex),
    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
pthread_mutex_init(shared_mutex , &mutexattr);

互斥锁和共享内存的清理留作练习...