2011-07-20 16 views
1

メインスレッドでも使用されている別の関数を再利用するスレッド関数を定義すると、競合条件が存在する可能性がありますか?同じ関数内のローカル変数はスレッド間で共有されていますか?この場合、do_work関数はthread_oneスレッドとメインスレッドの両方で使用されます。関数do_workのローカル変数xを両方のスレッドで変更できるので、予期しない結果が生じる可能性がありますか?C - pthread関数の再利用 - ローカル変数と競合条件

void *thread_one() { 
    int x = 0; 
    int result; 
    while(1) { 
     for(x=0; x<10; x++) { 
      result = do_work(x); 
     } 
     printf("THREAD: result: %i\n", result); 
    } 
} 

int do_work(int x) { 
    x = x + 5; 
    return x; 
} 

int main(int argc, char**argv) { 
    pthread_t the_thread; 
    if((rc1 = pthread_create(&the_thread, NULL, thread_one, NULL))) { 
     printf("failed to create thread %i\n", rc1); 
     exit(1); 
    } 
    int i = 0; 
    int result = 0; 
    while(1) { 
     for(i=0; i<12; i+=2) { 
      result = do_work(i); 
     } 
     printf("MAIN: result %i\n", result); 
    } 
    return 0; 
}  

答えて

5

いいえ。ローカル変数はスレッド間で共有されません。

+1

ただし、local * static *変数は共有されているため、安全にアクセスするには同期が必要な場合があります。 –

1

いいえxはローカル変数です。すべてのスレッドは自身のx変数で動作するため、スレッドが他のスレッドのxを変更する可能性はありません。

3

いいえ、スレッドのローカル変数はスレッド間で共有されません。

詳細には、各スレッドには独自のレジスタとスタックのセットがあります。ただし、コードとグローバルデータは共有されます。

1

いいえ、重要な点は、同じスレッド内であっても、関数の複数のインスタンス間でローカル(自動)変数が共有されないという点です。。これは、再帰がどのように機能し、関数が再入可能であるかを示します。