有关POSIX线程上的互斥锁的问题

时间:2014-03-04 20:54:05

标签: linux locking pthreads mutex

我在使用以下代码时遇到了一些问题。我似乎无法找到错误:

     1  #include <pthread.h>
     2  #include <stdio.h>
     3  #include <stdlib.h>
     4  #include <unistd.h>
     5  
     6  struct bla
     7  {
     8      pthread_mutex_t mut;
     9      int x;
    10  };
    11  
    12  
    13  pthread_t tid;
    14  
    15  void *thr_fn1 (struct bla *fp);
    16  
    17  int main()
    18  {
    19      struct bla *fp;
    20      fp = (struct bla *) malloc (sizeof(struct bla));
    21      fp->x=3;
    22      printf ("Initializing mutex_init\n");
    23      pthread_mutex_init (&fp->mut,NULL);
    24      pthread_create (&tid,NULL,thr_fn1,fp);
    25      sleep (2);
    26      printf ("Main thread ended sleep. Incrementing.\n");
    27      fp->x++;
    28      pthread_join (tid,NULL);
    29      printf ("x=%d\n",fp->x);
    30      pthread_mutex_destroy(&fp->mut);
    31      return 0;
    32  
    33  }
    34  
    35  void *thr_fn1 (struct bla *fp)
    36  {
    37      printf ("Locking new thread!\n");
    38      pthread_mutex_lock (&fp->mut);
    39      printf ("Sleeping.\n");
    40      sleep (5);
    41      pthread_mutex_unlock (&fp->mut);
    42      printf ("Thread unlocked.\n");
    43      return ((void *) 0);
    44  }

为什么价值仍会在第27行增加?它不应该被第二个线程中的互斥锁保护(第38行)吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

互斥锁和数据之间没有自动关联。如果您希望互斥锁保护某些特定的数据集,负责锁定和解锁对该数据的访问的互斥锁:

sleep (2);
pthread_mutex_lock(&fp->mut);
printf ("Main thread ended sleep. Incrementing.\n");
fp->x++;
pthread_mutex_unlock(&fp->mut);