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