0

ミューテックスがコードセグメントまたはコードセグメント内の変数で機能することについて、私は混乱しています。

以下の例では、ミューテックスは2つのスレッドがfunc1またはfunc2から同時にmysumにアクセスしようとするのを防ぎます。または、ミューテックスのロックとロック解除の間のコードセグメントのみが保護されます。

   .
   .
     pthread_mutex_t myMutex;
     int mysum;

  void func1(){
  .
  .
  .

  pthread_mutex_lock (&myMutex);
     mysum--;
     printf("Thread %ld did mysum=%d\n",id,mysum);
  pthread_mutex_unlock (&myMutex);
  .
  .
  }

  void func2(){
  .
  .
  .
  mysum++;

  pthread_mutex_lock (&myMutex);
     mysum++;
     printf("Thread %ld did mysum=%d\n",id,mysum);
  pthread_mutex_unlock (&myMutex);
  .
  .
  }

  int main (int argc, char *argv[])
  {
    pthread_mutex_init(&myMutex, NULL);
  .
  .

    pthread_create(&callThd1, &attr, func1, NULL); 

    pthread_create(&callThd2, &attr, func2, NULL); 
      pthread_create(&callThd3, &attr, func1, NULL); 

    pthread_create(&callThd4, &attr, func2, NULL); 
    pthread_create(&callThd5, &attr, func1, NULL); 

    pthread_create(&callThd6, &attr, func2, NULL); 
  .
  .


    pthread_mutex_destroy(&myMutex);
  .
  .

  }
4

1 に答える 1

0

ミューテックスは、との間にあるコードセクション間の相互排除のみを提供しますpthread_mutex_lock()pthread_mutex_unlock()これらはクリティカルセクションとして知られています)。

ミューテックスとそれが保護している共有データの間に直接のリンクはありません。適切なミューテックスがロックされている共有データにのみアクセスできるようにするのはあなた次第です。

于 2013-01-18T05:56:08.157 に答える