C goto会违反互斥锁吗?
我做错了,是吗C goto会违反互斥锁吗?,c,mutex,goto,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); 是的,goto在二进制代码级别直接向下jmp,因此将跳过goto和标签之间的任何函数调用,句号。互斥体是在pth
...
if( you_think_youre_genius )
goto goto_sucks:
...
pthread_mutex_lock(&mutex);
do_stuff();
goto_sucks:
do_other_stuff();
pthread_mutex_unlock(&mutex);
是的,goto在二进制代码级别直接向下jmp,因此将跳过goto和标签之间的任何函数调用,句号。互斥体是在
pthread\u mutex\u lock
函数中获取的。如果跳过函数调用,则不会获得互斥锁。如果尝试锁定互斥锁两次,可能会死锁。如果你试图解锁一个你不拥有的互斥锁,你可能会严重破坏它。如果该条件为真,则会在互斥锁未锁定的情况下调用do\u other\u 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);
goto和locks是地狱中的一对。也许一些
sed-i的/^\s*goto/#error/'*.cpp*.h*.c*.hpp
会帮助你!你在哪里释放锁?@Manoj编辑,谢谢。后藤的名声很坏,你的就是一个很好的例子。它打破了规则,在这些规则中投入了如此多的精力,以至于程序的流程被控制,各种锁被解锁,内存被释放,还有你所拥有的。话虽如此,还是有一些情况(很少),我发现它们是可用的。在这种情况下,锁不能在if之前移动吗?这将导致。。。在原始代码中的if语句之后。我认为最初的想法是不要将这部分代码锁在锁中。+1这个答案说明goto
本身不是问题,只是糟糕的程序逻辑。