Потоки в C++11: лучший способ приблизиться к защитникам блокировки?

В следующем примере:

Рабочий поток добавляет что-то к вектору:

std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);

UI::GetInstance().my_vector.push_back(new_value);

UI Thread проверяет список:

while (true) {
    std::lock_guard<std::mutex> guard(my_mutex);

    //perform my_vector operations and clear at the end
    my_vector.clear();
}

Мне не нравится блокировка каждой итерации, есть ли лучший подход к этому? Я надеялся установить какой-то флаг вроде этого, но я не уверен, что bools потокобезопасен:

Рабочий поток добавляет что-то к вектору:

std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);

UI::GetInstance().my_vector.push_back(new_value);
UI::GetInstance().my_vector_changed=true; // set a flag

UI Thread проверяет список:

while (true) {
    if (my_vector_changed) { // only lock on changes
        std::lock_guard<std::mutex> guard(my_mutex);
        //perform my_vector operations and clear at the end
        UI::GetInstance().my_vector.clear();
        my_vector_changed=false;
    }
}

Есть ли лучший подход для блокировки охранников?

1 ответ

Решение

Такого рода "кто-то сделал что-то интересное для данных, защищенных этим мьютексом" - это то, для чего нужны условные переменные - используйте condition_variable вместо.

Re ваша техника: это вроде как прокатить свое резюме, но если вы делаете это, обязательно сделайте bool быть atomic<bool> или же atomic_flag поскольку доступ к нему нужно синхронизировать, а иногда ждать, а не крутиться (постоянно опрашивать).

Другие вопросы по тегам