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);
互斥锁和共享内存的清理留作练习...
我将程序与在父子进程之间共享的互斥锁同步,但它的工作方式不如我预期,我期望:我输入 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);
互斥锁和共享内存的清理留作练习...