Во-первых, я хотел бы отметить, что я искал это, но не могу найти ответ, который я ищу/запутался с чрезмерно подробные ответы.Qt/C++: рекурсивные мьютексы, «зоны синхронизации» и блокирующие сигналы
У меня есть программа, которая использует два потока. А логические значения должны быть установлены и читать в тему А, но только для чтения в Thread В.
Тема A:
Module::Module(){
}
void Module::foo(){
mutex.lock();
bool request = true;
mutex.unlock();
}
void Module::bar(){
mutex.lock();
if (request){
mutex.unlock();
// do stuff
}else{
mutex.unlock();
}
}
Тема B:
Provider::Provider(){
module = new Module; // pointer to class request 'lives in'
}
void Provider::foo(){
mutex.lock();
if (module->request){
mutex.unlock();
// do stuff
}
}else{
mutex.unlock();
}
}
Мой вопрос может показаться довольно тривиально, но это меня беспокоит. Thread A не может читать и писать одновременно, поэтому я бы утвердил, что рекурсивный мьютекс не требуется для A. Однако существует небольшая возможность foo(), и bar() может вызываться одновременно из Thread B (Сигналы и слоты) , Означает ли это, что мне нужен рекурсивный мьютекс?
Также; есть ли причина не использовать Qt :: BlockingQueudConnection? Коллега утверждал, что это опасно, поскольку он посылает вызовы потоков спать до тех пор, пока сигнал не выполнит слот, но разве это не похоже на мьютекс?
Кроме того; видел сообщение о структурировании мьютекса (pthread mutex locking variables used in statements). Здесь он упоминает создание локальных копий по значениям. Если бы я использовал что-то подобное для Thread A, например.
mutex.lock();
requestCopy = request;
mutex.lock();
...
if(requestCopy){
// do stuff
}
Будет ли это также блокировать доступ к запросу по запросу? Копия становится привычной? Я хотел использовать этот стиль в своем коде для простоты, но это не сработает, если вы прочтете И напишите в потоке?
Любая помощь будет замечательной.
Я не вижу бар() где-либо, вызванный из потока B. –
Возможно, вне темы, но ... с точки зрения безопасности исключений вы должны предпочесть ['RAII'] (http://en.cppreference.com/w/cpp/язык/raii) стиль блокировки с использованием, например, ['lock_guard'] (http://en.cppreference.com/w/cpp/thread/lock_guard), а не явные пары' lock'/'unlock'. –
Спасибо @ G.M. Немного новичок в этом, так что заглянем в него. Olaf Dietsche - извините за простоту, которую я не показывал, но bar() время от времени будет вызываться asysnc из Thread B. Я разработал его так, чтобы Thread A & B не вызывал foo() одновременно - однако Я не могу этого гарантировать. – SamMetix