81
правка
Изменения
→condition_variable
=== condition_variable ===
Пусть есть тред t1, который что-то делает. Пусть другие треды должны ждать, пока t1 не закончит выполнение. Чтобы это сделать используются conditional_variable. Пример:
std::condition_variable cond_var;
std::mutex m;
int sum;
bool done = false;
std::thread th1([&]() {
std::unique_lock<std::mutex> lock(m);
for (int i = 0; i < 5; ++i) {
sum++;
}
done = true;
cond_var.notify_one();
});
std::thread th2([&]() {
std::unique_lock<std::mutex> lock(m);
if (!done)
cond_var.wait(m);
std::cout << sum;
});
int main() {
th1.join();
th2.join();
}
Важно, что второй тред уже взял lock на m. Т. е. cond_var.wait(m) делает следующие: отдает lock, ждет, когда кто-то сделает cond_var.notify_one() или cond_var.notify_all(), забирает lock обратно, продолжает работу программы. notify_all отличается от notify_one тем, что он будит сразу все треды, которые ждут, а не только один (случайный?).
=== понятие dead lock ===
Первый тред взял lock на A, второй на B. Первый хочет что-то сделать с B, второй с A. Оба ждут.