制約のあるデバイスでは、2つのboolで2つのスレッド間でロックを「偽装する」ことがよくあります。それぞれは1つのスレッドでのみ読み込まれ、他のスレッドによってのみ書き込まれます。私はこれをしないだろうPC上当然のことながらプリミティブ同期プリミティブ - 安全?
bool quitted = false, paused = false;
bool should_quit = false, should_pause = false;
void downloader_thread() {
quitted = false;
while(!should_quit) {
fill_buffer(bfr);
if(should_pause) {
is_paused = true;
while(should_pause) sleep(50);
is_paused = false;
}
}
quitted = true;
}
void ui_thread() {
// new Thread(downloader_thread).start();
// ...
should_pause = true;
while(!is_paused) sleep(50);
// resize buffer or something else non-thread-safe
should_pause = false;
}
が、制約のあるデバイス上で、それがロックを取得するよりもはるかに速くなりbool
値を読み取るようだ:ここで私が何を意味するかです。もちろん、バッファの変更が必要なときは、遅い回復のためにトレードオフします(「sleep(50)
」を参照)。
質問 - 完全にスレッドセーフですか?または、私がこのようなロックを偽装するときに気づいておく必要がある隠された落書きがありますか?それとも私はこれをやってはいけないのですか?
sleep(50)は*非常に遅い回復です - パラメータは秒単位です。セマフォーと比較して、私はおそらく、この方法でより多くの平均遅延を導入すると思います。 –
ここでスピンロックを行うべきです。 – RandomNickName42