有没有办法强制线程拥有独立的地址空间?我想让许多线程使用局部变量运行循环 - 但它们似乎都共享相同的变量。
例如
for (i = args->start; i < args->end; i++) {
printf("%d\n", i);
if (quickFind(getReverse(array[i]), 0, size - 1)) {
printf("%s\n", array[i]);
//strcpy(array[i], "");
}
}
i
似乎是跨线程共享的。
答案 0 :(得分:0)
线程共享其父进程的内存空间。它的特点。如果您不希望这种情况发生,您可以使用fork()创建一个新进程,该进程拥有自己的地址空间。
如果您决定使用fork(),请记住,在成功创建子进程时,它会向子进程返回0,并将子进程的PID返回到父进程。
答案 1 :(得分:0)
简短回答:是的,每个广告都可以拥有自己的变量i
副本。
答案很长:
所有线程共享相同的地址空间,并且操作系统不提供任何保护以防止一个线程访问另一个线程使用的内存。但是,可以对内存进行分区,使其只能由单个线程访问,而不是被所有线程共享。
默认情况下,每个线程都会收到自己的堆栈。因此,如果您在堆栈上分配一个变量,那么它通常只能由一个线程访问。请注意,可以将指向堆栈变量的指针从一个线程传递到另一个线程,但不建议这样做,这可能是您遇到的那类问题的根源。
线程接收自己的变量副本的另一种方法是使用线程本地存储。这允许每个线程拥有自己的全局变量副本。
总之,尽管线程共享一个地址空间,但它们可以处理私有数据。但是你需要注意如何在线程之间共享数据并避免数据争用。
答案 2 :(得分:0)
让每个线程分别调用该函数。每次调用函数都会获得自己的所有局部变量实例。如果不是这样,递归将无效。
答案 3 :(得分:0)
如果你想变得非常懒惰,并且不做任何设计更改(不是真的推荐),你可以将i
的声明修改为类似__thread int i
的声明,这样每个线程都会拥有它自己的变量实例。
如果您使用的是OpenMP而不是Posix主题,那么在第一次使用#pragma omp threadprivate(i)
之前,您也可以说i
。