我正在重构一些耗时的函数,以便可以从线程调用它,但是我无法解决这个问题(对线程编程不太熟悉)。
在任何时候,用户都可以取消并且该功能将停止。我不想在用户取消后立即终止线程,因为它可能会导致一些数据完整性问题。相反,在函数的几个地方,我会检查函数是否已被取消,如果是,则退出。我只会在我知道可以安全退出的情况下这样做。
该函数的整个代码将在一个互斥体中。这是我想到的伪代码:
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()
到达可以安全退出的点时,它将退出。
知道这是否都是线程安全的吗?