【问题标题】:will goto violate mutexes?goto 会违反互斥锁吗?
【发布时间】:2011-07-08 15:34:28
【问题描述】:

我做错了,是吗?

...
if( you_think_youre_genius )
    goto goto_sucks:
...
pthread_mutex_lock(&mutex);

    do_stuff();

    goto_sucks:
        do_other_stuff();

pthread_mutex_unlock(&mutex);

【问题讨论】:

  • goto 和 locks 是天造地设的一对。
  • 也许sed -i 's/^\s*goto/#error/' *.cpp *.h *.c *.hpp 会帮助你!
  • 你在哪里释放锁?
  • @Manoj R 已编辑,谢谢。
  • goto 的名声很差,而你的就是一个很好的例子。它打破了规则,他们付出了如此多的努力,以便控制程序的流程,解锁各种锁,释放内存,以及你有什么。话虽如此,有一些案例(很少),我发现它们是可用的。

标签: c mutex goto


【解决方案1】:

是的,goto 是在二进制代码级别直接向下跳转,因此在 goto 和标签之间的 任何 函数调用都将被跳过,句号。

【讨论】:

    【解决方案2】:

    互斥锁是在pthread_mutex_lock 函数中获取的。如果您跳过函数调用,您将不会获得互斥锁。如果您尝试锁定一个互斥锁两次,您可能会死锁。如果您尝试解锁不属于您的互斥锁,您可能会非常糟糕。

    【讨论】:

      【解决方案3】:

      如果条件为真,则调用do_other_stuff 而不锁定互斥体,然后释放互斥体而不锁定它。 完全错了!

      只是没有转到

      if( you_think_youre_genius )  
          {  
               pthread_mutex_lock(&mutex);    
           }   
      else  
      {   
      ...     
      pthread_mutex_lock(&mutex);   
      //Assumming no expetion thrown   
      do_stuff();   
      }   
      do_other_stuff();    
      pthread_mutex_unlock(&mutex);   
      

      【讨论】:

      • 这样的话,锁不能移到if之前吗?
      • 这将在原始代码中的 if 语句之后产生 ... 问题。我认为最初的想法是不要将这部分代码放在锁中。
      • +1 这个答案说明goto 本身不是问题,只是程序逻辑不好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2012-12-25
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多