首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PThreads地址空间

PThreads地址空间
EN

Stack Overflow用户
提问于 2013-10-04 10:56:49
回答 4查看 936关注 0票数 0

有没有办法强制线程拥有独立的地址空间?我希望有许多线程使用局部变量运行循环--但它们似乎都共享相同的变量。

例如

代码语言:javascript
复制
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似乎是跨线程共享的。

EN

回答 4

Stack Overflow用户

发布于 2013-10-04 11:27:05

线程共享其父进程的内存空间。这是他们的特点。如果您不希望发生这种情况,可以使用fork()创建一个新进程,该进程将拥有自己的地址空间。

如果您决定使用fork(),请记住,在成功创建子进程时,它会将0返回子进程,将子进程的PID返回给父进程。

票数 0
EN

Stack Overflow用户

发布于 2013-10-05 05:43:31

Short answer:是的,每个线程都有自己的变量i副本。

Long answer

所有线程共享相同的地址空间,并且OS不提供任何保护来防止一个线程访问另一个线程使用的内存。但是,可以对内存进行分区,使其仅由单个线程访问,而不是由所有线程共享。

默认情况下,每个线程接收自己的堆栈。因此,如果你在堆栈上分配一个变量,那么它通常只会被一个线程访问。请注意,可以将堆栈变量的指针从一个线程传递到另一个线程,但不建议这样做,这可能是您所看到的那种问题的根源。

线程接收自己的变量副本的另一种方法是使用线程本地存储。这允许每个线程拥有自己的全局变量副本。

总之,尽管线程共享一个地址空间,但它们可以处理私有数据。但是你需要小心在线程之间共享数据的方式,并避免数据竞争。

票数 0
EN

Stack Overflow用户

发布于 2013-10-05 07:56:21

只需让每个线程分别调用函数即可。函数的每次调用都有它自己的所有局部变量的实例。如果这不是真的,递归就不会起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19172441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档