Czy do zakończenia programu wymagany jest program? Innymi słowy, czy program, który działa wiecznie, jest technicznie niezdefiniowanym zachowaniem? Uwaga: nie chodzi o puste pętle. Mówiąc o programach, które na zawsze wykonują „rzeczy” (tj. Obserwowalne zachowania).
Np. Coś takiego:
int main()
{
while (true)
{
try
{
get_input(); // calls IO
process();
put_output(); // calls IO, has observable behavior
// never break, exit, terminate, etc
} catch(...)
{
// ignore all exceptions
// don't (re)throw
// never go out of loop
}
}
}
Jest to raczej pytanie akademickie, ponieważ empirycznie wszystkie rozsądne kompilatory wygenerują oczekiwany kod dla powyższego rodzaju programu (zakładając oczywiście, że nie ma innego źródła UB). I tak, oczywiście, istnieje wiele programów, które nigdy się nie kończą (OS, osadzone, serwery). Jednak czasami standard jest dziwaczny, stąd pytanie.
Styczne: wiele (niektórych?) Definicji „algorytmu” wymaga, aby algorytm się zakończył , tzn. Szereg operacji, które nigdy się nie kończą, nie jest uważany za algorytm.
Styczny. Problem zatrzymania mówi, że nie może istnieć algorytm określający, czy dowolny program zakończy działanie dla danych wejściowych. Jednak w przypadku tego konkretnego programu, ponieważ nie ma gałęzi, która prowadzi do wyjścia z głównego, kompilator może łatwo stwierdzić, że program nigdy się nie skończy. Jest to jednak nieistotne, ponieważ pytanie dotyczy prawnika ds. Języka.
Odpowiedzi:
W standardzie C ++ nie ma nic, co wymagałoby zakończenia programu lub dowolnego wątku. Najbliżej tego jest [intro.progress] p1 , co mówi
Dopóki istnieje pewne obserwowalne zachowanie, w końcu lub tak długo, jak spędza cały czas zablokowany na operacji we / wy lub innym blokującym wywołaniu biblioteki, nie ma to zastosowania, a program jest poprawny (zakładając, że spełnia wszystkie inne kryteria ważności).
źródło
std::mutex::lock()
to wywołanie biblioteki, które jest operacją synchronizacji, objętą czwartym punktem. Nie jest więc prawdą, że wymienione są tylko połączenia We / Wy.Tak. Od
[intro.progress]
źródło
get_input
iput_output
w przykładzie PO „wykonują wywołanie funkcji bibliotecznej we / wy”, program powinien być poprawny, nawet jeśli się nie zakończy?compiler does not know
- To nie ma znaczenia. Kompilator może wiedzieć i nie wiedzieć z punktu widzenia warstwy językowej - pytanie brzmi, czy w każdym razie jest poprawne.