будет нарушать мьютексы? - PullRequest
7 голосов
/ 04 марта 2011

Я делаю это неправильно, да?

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

    do_stuff();

    goto_sucks:
        do_other_stuff();

pthread_mutex_unlock(&mutex);

Ответы [ 3 ]

12 голосов
/ 04 марта 2011

Да, goto - это прямое снижение jmp на уровне двоичного кода, поэтому любые вызовы функций между goto и меткой будут пропущены, точка.

5 голосов
/ 04 марта 2011

Мьютекс получается внутри функции pthread_mutex_lock. Если вы перепрыгнете мимо вызова функции, вы не получите мьютекс. Если вы попытаетесь заблокировать мьютекс дважды, вы можете зайти в тупик. Если вы попытаетесь разблокировать мьютекс, который вам не принадлежит, вы можете очень сильно сломать его.

1 голос
/ 04 марта 2011

Если условие истинно, 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);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...