Зависимость между 2 фьючерсами

пожалуйста, посмотрите код ниже.

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, и я не знаю, как заставить программу работать в одном потоке.

Эта программа имеет UB независимо от номеров потоков. У вас гонка на cond.

Baum mit Augen 11.06.2018 11:44

Сделайте cond атомарным, и тогда ответ будет отрицательным; но я думаю, вам следует больше исследовать проблемы потоковой передачи и синхронизации.

UKMonkey 11.06.2018 11:47

но fut1.get () блокируется до тех пор, пока f1 не вернется правильно?

Eduard Rostomyan 11.06.2018 11:48

@EduardRostomyan UB означает, что все может случиться. Судя по тому, что вы опубликовали, компилятор может полностью исключить вызов f1, потому что он не имеет никакого эффекта; или он может предположить, что cond никогда не изменяется и всегда может считаться истинным.

UKMonkey 11.06.2018 11:51
get блокируется, только если результат еще не доступен, если поток уже завершен, тогда get просто возвращает значение. Будущее просто хранит результат, но не гарантирует, что потоки выполняются в любом порядке.
463035818_is_not_a_number 11.06.2018 11:51

никто не ответил на мой вопрос !! Если все идеально и нет гонки данных, и если у меня есть такой цикл в f1, программа завершится или нет? будет называться f2? Не могли бы вы ответить на этот вопрос вместо того, чтобы публиковать философию и показывать свое глубокое знание UB!

Eduard Rostomyan 11.06.2018 12:04

Я думаю, что вы здесь ошибаетесь. Даже на одноядерном процессоре с std::hardware_concurrency можно создавать потоки 1. Таким образом, даже если fut1.get() блокирует, f2 запустится в новом потоке, установите cond = false, чтобы разблокировать f1 - при условии "исправления" atomic, упомянутого в другом месте.

G.M. 11.06.2018 12:06

@EduardRostomyan Пока есть переключатель контекста (что означает почти всегда), программа не будет зацикливаться вечно. На самом деле это не связано с аппаратным параллелизмом.

freakish 11.06.2018 12:09

«Если все идеально и нет гонки за данными» ... но есть гонка за данными

463035818_is_not_a_number 11.06.2018 12:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта программа НЕ будет работать бесконечно, как только f2 () будет вызвана 2-м потоком, она установит для cond значение false.

Согласно определению Асинхронный: Функция шаблона асинхронный запускает функцию f асинхронно (потенциально в отдельном потоке, который может быть частью пула потоков) и возвращает std :: future, который в конечном итоге будет содержать результат вызова этой функции.

Есть 3 потока основной поток: поток f1: поток f2:

расход будет:

  1. основной поток
  2. поток f1 запускается --- тело f1 выполняется в соответствии с жизненным циклом потока
  3. поток f2 запускается --- тело f2 выполняется и устанавливает cond

когда f2 получит шанс, зависит от планирования потока и заблокированного заявленного например: если вы спите в f1 и f2 получит шанс

мне любопытно увидеть ответы других

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