gpt4 book ai didi

c - 访问 Pthread 上的共享数据

转载 作者:行者123 更新时间:2023-11-30 17:44:42 25 4
gpt4 key购买 nike

我刚刚开始学习 Pthreads,有人可以向我解释一下为什么示例 1 很危险而示例 2 很安全吗? (int*)malloc(sizeof(int)) 提供什么?

示例 1

 int *globalptr = NULL;
// shared ptr
void *foo1 ( void *ptr1 )
{
int i = 15;
globalptr = &i; // ??? dangerous!
...
}

void *foo2 ( void *ptr2 )
{
if (globalptr) *globalptr = 17;
...
}

示例 2

int *globalptr= NULL;
// shared ptr
void *foo1 ( void *ptr1 )
{
int i = 15;
globalptr =(int*)malloc(sizeof(int));
// safe, but possibly memory leak;
// OK if garbage collection ok
}

void *foo2 ( void *ptr2 )
{
if (globalptr) *globalptr = 17;
...
}

最佳答案

我认为这与一般线程或特别是 pthread 没有特别相关。这是一个标准 C 错误。

示例 1 将局部变量的地址分配给全局 ptr。局部变量将超出范围,并且(可能)稍后在重新使用堆栈时被不同的值覆盖。此时,全局 ptr 指向垃圾,或者至少指向不正确的内容。

示例2在heap上分配空间(在释放之前它不会消失)并将其分配给全局指针。其他一些函数需要记住释放 foo2 分配的空间,如果不这样做,那就是内存泄漏的地方。通常,人们会尝试让分配内存的人负责释放内存,但这在实践中并不是 100% 可能的。

常见 pthreads 错误

int main()
{
dataStruct a;

for (i...n)
a.somevalue = getData();
pthread_create(tid[i], NULL, threadfunc, (void *) &a);
}

无法保证线程何时被安排运行,或者它将复制传递给它自己的局部变量的数据。因此,当它使用传递的数据 ptr 时,它可能指向错误的内容。

关于c - 访问 Pthread 上的共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19881528/

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