É necessário um programa para terminar? Em outras palavras, é um programa que roda para sempre tecnicamente Comportamento indefinido? Observe que não se trata de loops vazios. Falando sobre programas que fazem "coisas" (ou seja, comportamento observável) para sempre.
Por exemplo, algo como isto:
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
}
}
}
Esta é mais uma questão acadêmica, pois empiricamente todos os compiladores sãos geram o código esperado para o tipo de programa acima (assumindo, é claro, nenhuma outra fonte de UB). E sim, é claro que existem muitos programas que nunca terminam (SO, incorporado, servidores). No entanto, o padrão é peculiar às vezes, daí a questão.
Tangencial: muitas (algumas?) Definições de "algoritmo" requerem que um algoritmo seja finalizado , ou seja, uma série de operações que nunca termina não é considerada um algoritmo.
Tangencial. O problema de parada afirma que não existe um algoritmo para determinar se um programa arbitrário termina para uma entrada. No entanto, para esse programa em particular, uma vez que não há ramificação que saia do main, o compilador pode determinar facilmente que o programa nunca terminará. No entanto, isso é irrelevante, pois a questão é o advogado da linguagem.
Respostas:
Não há nada no padrão C ++ que exija que o programa, ou qualquer thread fornecido, seja finalizado. A coisa mais próxima disso é [intro.progress] p1 , que diz
Contanto que exista algum comportamento observável, eventualmente, ou contanto que gaste todo o seu tempo bloqueado em uma operação de E / S ou outra chamada de biblioteca de bloqueio, isso não se aplica e o programa é válido (supondo que atenda a todas as outros critérios de validade).
fonte
std::mutex::lock()
é uma chamada de biblioteca que é uma operação de sincronização, abrangendo o quarto marcador. Portanto, não é verdade que apenas as chamadas de E / S sejam mencionadas.Sim. De
[intro.progress]
fonte
get_input
eput_output
no exemplo dos OPs "façam uma chamada para uma função de E / S da biblioteca", o programa deve ser válido mesmo que não seja finalizado?compiler does not know
Isso é irrelevante. O compilador pode saber e pode não saber, do ponto de vista da camada de idioma - a questão é se é válida, em qualquer caso.