Как остановить выполнение функции asyn c, когда ввод получен в C ++ - PullRequest
1 голос
/ 24 февраля 2020

Как следует из названия, я тестирую некоторые вещи со стандартной библиотекой, и я запутался в том, как убедиться, что именно был получен ввод. Мой код выглядит так:

static bool s_cinGet = false;

std::string CycleWords(std::vector<std::string> Words)
{
    unsigned int i = 0;
    while (!s_cinGet)
    {
        system("cls");
        std::cout << Words[i] << std::endl;
        i++;
        i = i % Words.size();
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
    if (i != 0) i--;
    else i = Words.size() - 1;
    return Words[i];
}

int main()
{
    std::vector<std::string> Words = { "Tunti", "Triliteral", "Carl" };

    while (true)
    {
        s_cinGet = false;
        auto future = std::async(CycleWords, Words);
        std::cin.get();
        s_cinGet = true;

        std::string word = future.get();

        //system("cls");
        std::cout << word << std::endl;
    }
    std::cin.get();
    return 0;
}

Программа действительно проста. Он перебирает некоторые слова, пока пользователь не нажмет любую клавишу и не напечатает последнее слово. Я хочу убедиться, что последнее слово было точно таким же словом, когда пользователь нажал клавишу. Любые предложения приветствуются.

1 Ответ

2 голосов
/ 24 февраля 2020

Как предложил @PeteBecker, изменение s_cinGet с bool на std::atomic<bool> избавляет от неопределенного поведения. Проблема решена.

...