Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C goto会违反互斥锁吗?_C_Mutex_Goto - Fatal编程技术网

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
本身不是问题,只是糟糕的程序逻辑。