会不会违反互斥锁?

时间:2011-03-04 07:57:52

标签: c mutex goto

我做错了,是吗?

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

    do_stuff();

    goto_sucks:
        do_other_stuff();

pthread_mutex_unlock(&mutex);

3 个答案:

答案 0 :(得分:12)

是的,goto是二进制代码级别的直接jmp,所以 goto和标签之间的任何函数调用将被跳过,句点。

答案 1 :(得分:5)

pthread_mutex_lock函数内获取互斥锁。如果跳过函数调用,则不会获得互斥锁。如果您尝试两次锁定互斥锁,则可能会死锁。如果你试图解锁你不拥有的互斥锁,你可能会非常糟糕。

答案 2 :(得分:1)

如果条件为真,则在没有锁定互斥锁的情况下调用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);