【问题标题】:mutex works on code segment or variables in a code segment?互斥锁适用于代码段或代码段中的变量?
【发布时间】:2013-01-01 00:49:48
【问题描述】:

我对互斥锁对代码段或代码段中的变量起作用感到困惑。

在下面的示例中,互斥锁将阻止两个线程同时尝试从 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);
  .
  .

  }

【问题讨论】:

  • Mutex 仅用于保护数据。代码(除非自我修改,在这种情况下停止这样做!),本质上是线程安全的。

标签: pthreads mutex


【解决方案1】:

互斥锁仅在位于pthread_mutex_lock()pthread_mutex_unlock() 之间的代码段之间提供互斥(这些称为临界区)。

互斥锁与其所保护的共享数据之间没有直接联系 - 由您来确保您只访问锁定了相应互斥锁的共享数据。

【讨论】:

  • 所以,我知道不存在保护变量的显式编程结构,这必须通过有效使用互斥和临界区来实现。在这种情况下,在上面的示例中,我将无法控制在不同线程中调用的 func1 和 func2 中的 mysum。信号量可以在这里提供帮助吗?
  • 我找到了回答上述问题的帖子stackoverflow.com/questions/5454746/…。谢谢!
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2014-04-10
相关资源
最近更新 更多