【发布时间】:2014-10-01 12:26:55
【问题描述】:
我有以下 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);
}
输出:
线程 3:子 13248 已退出。 thread3:来自 mmap 的子 pid:13248 线程 2:子 13249 已退出。 thread2:来自 mmap 的子 pid:13249 线程 3:子 13250 已退出。 thread3:来自 mmap 的子 pid:0 线程 3:子 13252 已退出。 thread3:来自 mmap 的子 pid:0 线程 1:子 13251 已退出。 thread1:来自 mmap 的子 pid:13250 线程 1:子 13253 已退出。 thread1:来自 mmap 的子 pid:0 thread1:子 13254 已退出。 thread1:来自 mmap 的子 pid:0 线程 2:子 13255 已退出。 thread2:来自 mmap 的子 pid:13252 线程 2:子 13256 已退出。 thread2:来自 mmap 的子 pid:13256可以注意到打印的 pid 值不匹配。如果我用互斥锁保护ipc_test 中的代码,pid 值会正确打印。上面mmap函数的使用方式不是线程安全的吗?
【问题讨论】:
标签: c multithreading pthreads ipc mmap