私は現在QTimer
実装のスレッドセーフについて考えています。私のアプリケーションでQTimerのisActive()メソッドはスレッドセーフですか?
私はタイマーが作動しているかどうかチェックするためにbool isActive()
メソッドを使用します。このメソッドを他のスレッドからも使用する予定であるため、私の考えはスレッドセーフに対する考慮事項になりました。
は、私の研究によれば、この方法bool isActive()
はスレッドセーフではありません。ここで
は私の仮定です:
QTimer
(QTimer source code)の実装では、メンバー変数int id;
が0より大きい場合bool isActive()
はちょうどチェックしていることを示しています。
inline bool isActive() const { return id >= 0; }
このメンバ変数がで初期化されます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はスレッドセーフではなく、リエントラントでもありません。あなたのコードのmutexでさえ、安全にすることはできません。 – peppe