Является ли этот код потокобезопасным?

Я рефакторинг какой-то трудоемкой функции, чтобы ее можно было вызывать из потока, но у меня возникли проблемы с обдумыванием проблемы (не очень знаком с программированием потоков).

В любой момент пользователь может отменить, и функция остановится. Я не хочу убивать поток, как только пользователь отменяет его, поскольку это может вызвать некоторые проблемы с целостностью данных. Вместо этого в нескольких местах функции я проверю, была ли функция отменена, и если да, то выйду. Я буду делать это только тогда, когда знаю, что безопасно выйти.

Весь код функции будет внутри мьютекса. Вот псевдокод, который я имею в виду:

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()достигает точки, из которой можно безопасно выйти, он завершится.

Любая идея, если это все потокобезопасно?

0
задан Gray 20 May 2012 в 14:30
поделиться