Я рефакторинг какой-то трудоемкой функции, чтобы ее можно было вызывать из потока, но у меня возникли проблемы с обдумыванием проблемы (не очень знаком с программированием потоков).
В любой момент пользователь может отменить, и функция остановится. Я не хочу убивать поток, как только пользователь отменяет его, поскольку это может вызвать некоторые проблемы с целостностью данных. Вместо этого в нескольких местах функции я проверю, была ли функция отменена, и если да, то выйду. Я буду делать это только тогда, когда знаю, что безопасно выйти.
Весь код функции будет внутри мьютекса. Вот псевдокод, который я имею в виду:
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()
достигает точки, из которой можно безопасно выйти, он завершится.
Любая идея, если это все потокобезопасно?