У меня есть простая программа, в которой я хочу выводить числа 1-100, причем один поток выводит все нечетные числа, а другой - все четные числа. Используя lock_guard, это довольно простая задача. Код следующим образом:использовать переменную условия вместо lock_guard
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
std::mutex m;
void print_numbers(int i)
{
for (i; i <= 100; i++)
{
std::lock_guard<std::mutex> locker(m);
std::cout << i << std::endl;
++i;
}
}
int main()
{
std::thread t1(print_numbers, 0);
std::thread t2(print_numbers, 1);
t1.join();
t2.join();
return 0;
}
Мой вопрос, как я могу использовать переменные условия, чтобы сделать это, и, возможно, сделать его немного более элегантно?
Простые 'std :: mutex' (и' std :: lock_guard' вместе) и 'std :: condition_variable' - это как-то _orthogonal_ понятия. Фактически для 'std :: condition_variable' на самом деле требуется использовать как минимум 2 мьютекса, поэтому можно утверждать, что это более элегантно. Вы используете переменные условия, чтобы пробудить потоки для изменений состояния, таким образом, они похожи на семафоры, я не вижу, как этот код действительно нужен. –
Я понимаю, спасибо. Однако, тем не менее, ради изучения только, предложите ли вы способ использования двух мьютексов с переменной условия для достижения того же результата? – Iason
Ну, вам даже не нужен 'std :: mutex' для вашего образца кода, 2 потока работают полностью независимо от копии' i', изменения никогда не будут мешать или будут подвержены условиям гонки. Ваш 'std: mutex m;' является фиктивным и не нужен. –