スレッドから呼び出すことができるように、時間のかかる関数をリファクタリングしていますが、問題に頭を悩ませています(スレッドプログラミングにあまり詳しくありません)。
ユーザーはいつでもキャンセルでき、機能は停止します。データの整合性に問題が発生する可能性があるため、ユーザーがキャンセルした直後にスレッドを強制終了したくありません。代わりに、関数のいくつかの場所で、関数がキャンセルされているかどうかを確認し、キャンセルされている場合は終了します。私はそれを、安全に終了できるとわかっている場合にのみ行います。
関数のコード全体がミューテックス内にあります。これは私が念頭に置いている擬似コードです:
SomeClass::SomeClass() {
cancelled_ = false;
}
void SomeClass::cancelBigSearch() {
cancelled_ = true;
}
void SomeClass::bigSearch() {
mutex.lock();
// ...
// Some code
// ...
// Safe to exit at this point
if (cancelled_) {
mutex.unlock();
cancelled_ = false;
return;
}
// ...
// Some more code
// ...
if (cancelled_) {
mutex.unlock();
cancelled_ = false;
return;
}
// ...
// Again more code
// ...
if (cancelled_) {
mutex.unlock();
cancelled_ = false;
return;
}
mutex.unlock();
}
したがって、ユーザーが検索を開始すると、新しいスレッドが。を呼び出しますbigSearch()
。ユーザーがキャンセルすると、cancelBigSearch()
が呼び出され、cancelled_
フラグが設定されます。その後、bigSearch()
安全に終了できるポイントに到達すると、終了します。
これがすべてスレッドセーフであるかどうかはわかりますか?