gpt4 book ai didi

c - mmap() 用于共享内存和线程

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:49 26 4
gpt4 key购买 nike

我有以下 C 函数:

int ipc_test(char *tstr)
{
int *x = mmap(0, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

if(fork() == 0) {
*x = getpid();
exit(0);
} else {
int status;
printf("%s: Child %d exited.\n", tstr, wait(&status));

printf("%s: Child pid from mmap: %d\n", tstr, *x);
}
}

我调用上面的代码如下:

void *thread_func(void *data)
{
int i=0;

while(i<3) {
ipc_test(data);
i++;
printf("\n");
}
}

int main(int ac, char **av)
{
pthread_t th1, th2, th3;

pthread_create(&th1, NULL, thread_func, "thread1");
pthread_create(&th2, NULL, thread_func, "thread2");
pthread_create(&th3, NULL, thread_func, "thread3");

pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_join(th3, NULL);
}

输出:

thread3: Child 13248 exited.thread3: Child pid from mmap: 13248thread2: Child 13249 exited.thread2: Child pid from mmap: 13249thread3: Child 13250 exited.thread3: Child pid from mmap: 0thread3: Child 13252 exited.thread3: Child pid from mmap: 0thread1: Child 13251 exited.thread1: Child pid from mmap: 13250thread1: Child 13253 exited.thread1: Child pid from mmap: 0thread1: Child 13254 exited.thread1: Child pid from mmap: 0thread2: Child 13255 exited.thread2: Child pid from mmap: 13252thread2: Child 13256 exited.thread2: Child pid from mmap: 13256

可以看出打印出来的pid值有不匹配的地方。如果我用互斥锁保护 ipc_test 中的代码,pid 值就会正确打印。上面mmap函数的使用方式不是线程安全的吗?

最佳答案

虽然您的程序中可能还有其他问题,但最明显的问题是您在使用 wait 等待子进程退出时可能有多个子进程。这将最终从另一个线程随机“窃取”子进程,而不是等待您想要等待的子进程(您刚刚在此线程中创建的那个)。您需要使用 waitpid 并请求您刚刚创建的特定子进程(这需要保存 fork 的返回值而不是将其丢弃)。一般来说,wait 的使用本质上始终是一个错误,除了在玩具/示例程序中。始终将 waitpid 与您要等待的显式 pid 一起使用。

关于c - mmap() 用于共享内存和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com