2017-05-10 8 views
1

以下のコードから、出力の回答は8のみですか?他にどのような可能な出力がありますか(説明は素晴らしいでしょう)?異なる可能なプログラム出力?

int i = 0; 
void *doit(void *vargp) { 
    i = i + 5; 
} 
int main() { 
    pthread_t tid; 
    pthread_create(&tid, NULL, doit, NULL); 
    i = i + 3; 
    pthread_join(tid, NULL); 
    printf("%d\n", i); 
} 
+0

テストしましたか? – Carcigenicate

+0

あなたのプログラムは、複数のスレッドからのオブジェクトへの読み取り不能で非原子的で非同期のアクセスを持つため、動作は未定義です。したがって、プログラムは全く無意味です。プログラムから何らかの出力がある必要はなく、存在する場合、出力が「象」であることは完全に許容されます。 – EOF

+0

@EOFこれは練習問題の1つです。与えられたコードに基づいて、出力は3か8のどちらかになりますか? – ssss

答えて

1

あなたがミューテックスを使用していないので、あなたはメインスレッドとのdoItスレッドの両方がI = 0とは、私は5または3

修正に設定されている参照未定義の動作に遭遇することがあり次のようになります:

int i = 0; 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // this is since the mutex is a global variable. 

void *doit(void *vargp) { 
    pthread_mutex_lock(mutex); 
    i = i + 5; 
    pthread_mutex_unlock(mutex); 
} 

int main() { 
    pthread_t tid; 
    int *ptr = &i; 
    pthread_create(&tid, NULL, doit, NULL); 

    pthread_mutex_lock(mutex); 
    i = i + 3; 
    pthread_mutex_unlock(mutex); 

    pthread_join(tid, NULL); 
    printf("%d",i); 
} 
+0

オリジナルの問題から、答えは3,5、および8の両方が可能でしたか? – ssss

+0

@ssss:それは答えの最小限のセットです - 多種多様なゴミもあります。 –

関連する問題