현재 QTimer
구현의 threadsafety에 대해 생각하고 있습니다.QTimer의 isActive() 메소드가 스레드 안전합니까?
내 응용 프로그램에서 타이머가 실행 중인지 확인하려면 bool isActive()
메서드를 사용합니다. 이 메서드를 다른 스레드에서도 사용할 계획이므로 스레드에 대한 고려 사항을 생각해 봤습니다.
내 연구에 따르면 bool isActive()
메서드는 스레드 세이프가 아닙니다. 이 멤버 변수가 초기화된다
inline bool isActive() const { return id >= 0; }
:
가QTimer
(QTimer source code)의 구현이 부재 가변 int id;
큰 0 넘으면 bool isActive()
단지 확인 것을 보여준다 : 여기서
INV_TIMER
이고 이는
-1
으로 정의됩니다. 타이머가 시작되면
int QObject::startTimer(int interval)
의 반환 값으로 설정됩니다.
isActive()
에 대한 호출이 내 의견으로는, 다른 스레드에서
QTimer::start()
동안 실행
/*! \overload start()
Starts or restarts the timer with the timeout specified in \l interval.
If \l singleShot is true, the timer will be activated only once.
*/
void QTimer::start()
{
if (id != INV_TIMER) // stop running timer
stop();
nulltimer = (!inter && single);
id = QObject::startTimer(inter);
}
bool isActive()
의 반환 값은 유효하지 않을 수 있습니다.
내 가정을 확인할 수있는 사람의 견해에 감사드립니다.
스레드 안전성에 도달하려면 아래 코드 스 니펫과 같이 뮤텍스를 사용하여 타이머를 호출해야합니다.
class SensorControl : public QObject
{
Q_OBJECT
public:
SensorControl(); // inits and interval-settings are done at implementation
bool Start()
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->start();
}
void Stop()
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->stop();
}
bool IsMeasuring() const
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->isActive();
}
private:
QMutex m_mutexTimer;
QTimer* m_pTimer;
};
QTimer는 스레드 안전하지 않으므로 재진입 중이 아닙니다. 따라서 코드의 뮤텍스조차도 안전합니다. – peppe