私は1つの原子変数(bool)とその変数をポーリングする別のスレッドを変更するスレッドを持っています。私のアプリケーションでは、thread A
で関数呼び出しがほとんどなく、特定の1つの原子変数でポーリングを開始します。 Thread B
は、一部の外部アプリケーション(application on dbus
)のステータスを読み続けるため、それに応じて少数のアトミック変数を変更します。 Thread A
の関数は、戻り値がある場合、外部アプリケーションが状態を希望の状態に変更して、これらのアトミックフラグを介して知るようにしたいと考えています。私のアプリケーションのC++の原子変数(bool)のポーリング?
詳細:
機能thread A
でdbus API
を使用して近くのBLEデバイスのスキャンを開始start_scan()
機能です。ただし、start scan
呼び出しが成功したにもかかわらず、外部アプリケーション(org.bluez
)がプロパティ(Property: Discovering
)の更新に少し時間がかかります。私はまた、外部アプリケーションの現在の状態についていくつかの変数(私のアプリケーションの内部)を照会するisScanning
のような関数を定義しました。外部アプリケーションのプロパティが更新されると、PropertiesChanged
シグナルを介してdbus
に通知され、はい、start_scan
への呼び出しが成功した後、スキャンのためにPropertiesChanged
シグナルを受信するまでに時間がかかります(1秒未満)。だから、start_scan
関数から戻る前に自分のローカルアトミックフラグを(自分のタイムアウト機構で)ポーリングすることを考えています。が有効な状態を返します。
synの中に必要な多くの関数とフラグがあるので、私はcondition_variableを使用できません。
問題:スレッドAがscanning_
フラグのポーリングされるときに、スレッドBがscanning_
フラグを更新するdbus
信号を受信する
std::atomic<bool> scanning_;
// Thread A
void start_scan()
{
// Dbus methods call
while (scanning_ == false) { // With some timeout
// Timeout mechanism
}
}
// Thread B receving asyn signals from DBus
void propertyUpdate(std::string name, bool value)
{
if (name == "Discovering")
scanning_ = value;
...
}
。私はThread A
がスレッドBを絶えず旗を読んでいて、私の旗が原子的であるかのようにチョークするかどうか分からないのですか?原子変数が利用可能になると、スレッドが原子変数アクセスを待つスレッドがどのようにスケジュールされているかを知りたいですか?
EDIT:
が、私はこのような何かをしています:
void setter(bool value)
{
std::lock_guard<std::mutex lock(mutex_);
member_ = value;
}
bool getter(void)
{
std::lock_guard<std::mutex lock(mutex_);
return member_;
}
// Thread A is blocking on a class member value
while (getter() == false);
// Thread B will modify the class member when required
setter(true);
は私があるため、共通のミューテックスでブロックされたスレッドのスケジューリングの顔可能性のある問題を知ってほしいです。スレッドAがmutex_を取得し続ける可能性はありますが、スレッドBは永遠にブロックされます。スレッドAが返された後、スレッドAが再びmutex_を取得する前に、スレッドBがgetter
関数の復帰後にスケジュールされていない場合に発生する可能性があります。
ミューテックスやセマフォーを使用できませんでしたか? – rcgldr
ポーリングはリソースの無駄であり、標準ではそれが動作することを保証するものではありません。条件変数を使用します。 –
@ n.m .:私のスレッドが他のスレッドによって変更された変数をポーリングすると、私のスレッドは更新を見ないでしょうか? – abhiarora