0

我刚开始研究 Pthreads,有人可以向我解释为什么它Example 1是危险的,而它Example 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;
 ...
 }
4

1 回答 1

0

我不认为这与一般的线程或特别是 pthreads 特别相关。这是一个标准的 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 时,它可能指向错误的东西。

于 2013-11-09T18:46:51.327 回答