пожалуйста, посмотрите код ниже.
int cond = true;
void f1()
{
while(cond)
{
}
}
void f2()
{
cond = false;
}
int main()
{
auto fut1 = std::async(f1);
auto fut2 = std::async(f2);
fut1.get();
fut2.get();
}
Мой вопрос: будет ли эта программа работать бесконечно на однопоточном sw / hw? Я не могу это проверить, потому что мой std :: hardware_concurrency показывает 8, и я не знаю, как заставить программу работать в одном потоке.
Сделайте cond атомарным, и тогда ответ будет отрицательным; но я думаю, вам следует больше исследовать проблемы потоковой передачи и синхронизации.
но fut1.get () блокируется до тех пор, пока f1 не вернется правильно?
@EduardRostomyan UB означает, что все может случиться. Судя по тому, что вы опубликовали, компилятор может полностью исключить вызов f1, потому что он не имеет никакого эффекта; или он может предположить, что cond никогда не изменяется и всегда может считаться истинным.
get блокируется, только если результат еще не доступен, если поток уже завершен, тогда get просто возвращает значение. Будущее просто хранит результат, но не гарантирует, что потоки выполняются в любом порядке.
никто не ответил на мой вопрос !! Если все идеально и нет гонки данных, и если у меня есть такой цикл в f1, программа завершится или нет? будет называться f2? Не могли бы вы ответить на этот вопрос вместо того, чтобы публиковать философию и показывать свое глубокое знание UB!
Я думаю, что вы здесь ошибаетесь. Даже на одноядерном процессоре с std::hardware_concurrency можно создавать потоки 1. Таким образом, даже если fut1.get() блокирует, f2 запустится в новом потоке, установите cond = false, чтобы разблокировать f1 - при условии "исправления" atomic, упомянутого в другом месте.
@EduardRostomyan Пока есть переключатель контекста (что означает почти всегда), программа не будет зацикливаться вечно. На самом деле это не связано с аппаратным параллелизмом.
«Если все идеально и нет гонки за данными» ... но есть гонка за данными





Эта программа НЕ будет работать бесконечно, как только f2 () будет вызвана 2-м потоком, она установит для cond значение false.
Согласно определению Асинхронный: Функция шаблона асинхронный запускает функцию f асинхронно (потенциально в отдельном потоке, который может быть частью пула потоков) и возвращает std :: future, который в конечном итоге будет содержать результат вызова этой функции.
Есть 3 потока основной поток: поток f1: поток f2:
расход будет:
когда f2 получит шанс, зависит от планирования потока и заблокированного заявленного например: если вы спите в f1 и f2 получит шанс
мне любопытно увидеть ответы других
Эта программа имеет UB независимо от номеров потоков. У вас гонка на
cond.