Zadanie: Wykonaj funkcję, która poczeka np 5s na podanie wartości. Jeżeli ta nie zostanie wczytana program ma wykonywać się dalej.
Problem został zaczerpnięty z tego tematu: link
Nie znam jeszcze zbyt wielu zagadnień dot. wielowątkowości (tak właściwe kojarzę tylko podstawowe std::thread), ale udało mi się napisać coś takiego:
#include <iostream>
#include <thread>
#include <chrono>
template <typename T>
bool read_or_wait(T& var, std::chrono::seconds wait_time);
int main()
{
int number = 7;
using namespace std::chrono_literals;
std::cout << "Podaj liczbę: ";
std::cout << (
read_or_wait(number, 4s)
? "Podałeś wartość: "
: "Za wolno :P \nWybrałem za Ciebie wartość: ")
<< number << "\n";
}
template <typename T>
bool read_or_wait(T& var, std::chrono::seconds wait_time)
{
bool value_is_read = false; // mutex? atomic?
auto read = [&var, &value_is_read]
{
std::cin >> var;
value_is_read = true;
};
auto wait = [&wait_time, &value_is_read]
{
auto begin = std::chrono::high_resolution_clock::now();
auto end = begin + wait_time;
do {
std::this_thread::yield(); // nie chcę usypiać całego wątku, bo nie wiem kiedy zostanie pobrana wartosć
if (value_is_read) // jeżeli wartość zostanie wczytana to przerwanie funkcji wait()
return;
} while (std::chrono::high_resolution_clock::now() < end);
};
std::thread reading(read);
std::thread waiting(wait);
reading.detach(); // nie chcę czekać na wywołanie tej funkcji gdy czas na podanie wartości się skończył
waiting.join();
return value_is_read;
}
Funkcja działa tak jak chciałem, ale czy takie rozwiązanie jest bezpieczne? Co się dzieje z funkcją read na odłączonym wątku gdy funkcja read_or_wait zwróci wartość? Jak wykonać to lepiej?