2016-10-25 14 views
0

私は古い検査からの質問とその回答を持っていますが、私は解決策を理解していません。誰かが私にそれを説明することはできますか?これらの2つの質問(cプログラム、mutex、スレッド)の解決方法をsomoneで説明できますか?

int a = 0; 
int b = 0; 
pthread_mutex_t m; 

void * f() 
{ 
    _________________ (Empty Line for question number 2) 
    a = a + 1; 
    pthread_mutex_lock(&m); 
    b = b + 1; 
    printf("a = %d, b = %d\n", a, b); 
    pthread_mutex_unlock(&m); 
    return NULL; 
} 

int main() { 
    pthread_t t1, t2; 
    pthread_mutex_init(&m, NULL); 
    pthread_create(&t1, NULL, &f, NULL); 
    pthread_create(&t2, NULL, &f, NULL); 
    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
    return 0; 
} 
  1. プログラムはどのように多くの異なる印刷出力を発することができます。

    は、このCのプログラムを考えると? (答えは3です)

  2. さまざまな印刷オプションを1に減らすために空行に追加できるコードは何ですか? (答えはint a=0;です)

私はこれらの回答にどのように到達する必要がありますか?

+3

印刷オプションとは何ですか? – mch

+1

そこに 'a'にレースの条件があります。変数 'a'は、プログラムの実行後に1または2にすることができます。そして、これは神秘的な印刷オプションと関係があると私は賭けるでしょう。 –

+0

オペレーティングシステムのタグが実際に問題に適合していない –

答えて

0

abという異なる値の組み合わせが「印刷オプション」で印刷されていると仮定します。

だから、開始時に、あなたはab = 0

を持って、あなたがスレッドを作成し、その結果は確定的ではありませんaのレース条件があります。何が起こる可能性:

t1:read a=0 write a=0+1 
t1:read b=0 write b=0+1 
t1:print `a=1, b=1` 
t2:read a=1 write a=1+1 
t2:read b=1 write b=1+1 
t2:print `a=2, b=2` 

起こる可能性のある他の事:

t1: read a =0 
t2: read a =0 
t1: write a =0+1 
t2: write a =0+1 
t1: read b=0 write b=0+1 
t1: print `a=1, b=1` 
t2: read b=1 write b=1+1 
t2: print `a=1, b=2` 

これは1つの可能性です。 aの読み取りと書き込みはいつでも実行できます。しかし、これらは異なる出力がどのように起こるかの例である。 t1およびt2も交換可能である。 t1が最初に実行される保証はありません。

2番目の答えは、aローカルaでグローバルaを隠し、他のスレッドで上書きすることはできません。だから出力は常にそうです。

a=1, b=1 a=1, b=2

編集:最初の質問aを読み出し、別途記述されている場合、この問題が発生

a=2, b=1 a=2, b=2

ための第3の印刷シナリオを忘れてしまった(最初に読み書き書き込みT1を読み出しますt2)、最初のスレッドが印刷を行う前に。

関連する問題