我做错了,是吗?
...
if( you_think_youre_genius )
goto goto_sucks:
...
pthread_mutex_lock(&mutex);
do_stuff();
goto_sucks:
do_other_stuff();
pthread_mutex_unlock(&mutex);
答案 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);