Потоки в 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
поскольку доступ к нему нужно синхронизировать, а иногда ждать, а не крутиться (постоянно опрашивать).