LINUX.ORG.RU

Вызов метода принадлежащего bобъекту в другом потоке

 ,


0

1

Добрый день. Есть два объекта А и B. Каждый работает в своем потоке. В определенный момент проверяю состояние объекта B, что там у него происходит.

if(B->getState() == Free){

}
объект B живет в своем потоке своей жизнью соответственно и изредка меняет переменную mState
QString B::getState(){
     return mState;
}
Может ли так произойти что объект А обращаясь напрямую к данным объекта B нарушит что-либо, т.е. имеют ли поля объекта атомарную целостность? Нужно ли в момент обращения к данным объекта, работающего в другом потоке защищать их мьютексами, т.к. поток B сам может в любой момент поменять эти данные.
QString B::getState(){
      QMutexLocker(&mutex)
      return mState;
}
void B::modifyState(const QString& st){
      QMutexLocker(&mutex)
      mState = st;
}



Последнее исправление: da17 (всего исправлений: 2)

Сигналы и слоты для кого потокобезопасными сделали ?!

CrossFire ★★★★★
()

т.е. имеют ли поля объекта атомарную целостность

Если ты её сделал, то имеют. Твой код ок, но почему не использовать например сигнал/слоты? Или invokemethod?

Stil ★★★★★
()
Ответ на: комментарий от Stil

Тоже себя об этом спрашиваю. Ответ в том что в данный момент объекту А нужно прямо сейчас узнать состояние в B и от этого зависят действия A в текущем методе. Если я вас правильно понял, могу сделать emit который запросит у потока B состояние и вернет мне его через сигнал в какой-нибудь slot, что-то вроде

connect(a, state, b, getState);
connect(b, sendState, a, setState);
void a::setState(QString st){
    mbState = st;
}
QString B::getState(){
     emit sendState( mState );
} 
но если после того как я сделал в A запрос состояния B следующий строчкой идет уже анализ этого состояния, то я никак не могу разобраться что будет дальше. B получит запрос, отправит сигнал и в объекте А изменится переменная bmState, после чего А продолжит работу или В получит запрос который встанет в очередь и после отработки текущего метода дойдет очередь до вызова слота объекта А::setState
//запрос состояния B
emit state();
//Анализ состояния B
if (getBState() == Free){
}

da17
() автор топика
Ответ на: комментарий от da17

Вот это не нужно:

connect(a, state, b, getState);
connect(b, sendState, a, setState);
void a::setState(QString st){
    mbState = st;
}
QString B::getState(){
     emit sendState( mState );
}
Просто:
connect(b, stateChanged, a, bStateChanged);
T B::someMethodThatAffectsState(){
    // ...
    emit stateChanged(mState);
}
void a::bStateChanged(const T& newState){
    mbState = newState;
}

Stil ★★★★★
()
Ответ на: комментарий от da17

Ответ в том что в данный момент объекту А нужно прямо сейчас узнать состояние в B и от этого зависят действия A в текущем методе.

Ну если вариант, когда A просто всегда знает состояние B тебя не устраивает, то тогда приделывай защиту от гонок и смотри прямо, как в ОП

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.