У меня есть проблема с мьютексами ...Мьютексов внутри, если условие
Это общая структура моего кода:
#include <mutex>
std::mutex m;
While(1){
m.lock();
if(global_variable1==1){
//CODE GOES HERE
if (err==error::eof){
cout<<"error!"<<endl;
//should I put a m.unlock() here??
continue;
}
int something=1;
global_variable2=something;
}
m.unlock();
usleep(100000);
}
В принципе, я хочу, чтобы изменить глобальные переменную безопасно, так что я думаю необходимо использовать мьютексы. Я должен только разблокировать мьютекс после этой функции «if (global_variable1 == 1)», но если есть ошибка, мьютекс не будет разблокирован. Могу ли я разблокировать его перед «продолжением»? Или это все испортит что-нибудь еще? Может ли иметь две разблокировки для одного и того же mutex.lock() иметь нежелательное поведение?
вы должны гарантирую 'разблокировку();' вызов, но если вы поставите его перед 'продолжить,' вы можете быть уверены, что 'разблокировки(); 'будет называться в конце концов? –
есть. Замок вызывается перед первым 'if'. Есть только два выхода: 'if (error)' и конец первого 'if'. есть разблокировка после первого if. Вопрос в том, должен ли я иметь тот, который прокомментирован? – Carollour
Кажется, вы должны. В противном случае будет и разблокирован мьютекс, когда возникла ошибка после того, как 'continue' обходит нижнюю' unlock() ' –