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 では、ヒープ (解放されるまで消えない) にスペースを割り当て、それをグローバル ポインターに割り当てます。他の関数は、foo2 が割り当てたスペースを解放することを覚えておく必要があります。そうでない場合は、そこがメモリ リークの原因です。原則として、人々はメモリを割り当てる側にそれを解放する責任を持たせようとしますが、実際には 100% 可能ではありません。

一般的な pthread エラー

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 に答える