O que acontece com um segmento desconectado quando o main () sai?

Suponha que eu esteja começandostd::thread e depoisdetach() isso, então o thread continua executando mesmo que ostd::thread que uma vez representada, sai do escopo.

Suponha ainda que o programa não tenha um protocolo confiável para unir o encadeamento desanexado1, então o segmento desanexado ainda é executado quandomain() sai.

Não consigo encontrar nada no padrão (mais precisamente, no N3797 C ++ 14 draft), que descreve o que deve acontecer, nem 1.10 nem 30.3 contêm uma redação pertinente.

1 Outra questão, provavelmente equivalente, é: "um thread desanexado pode ser juntado novamente", porque qualquer que seja o protocolo para o qual você está inventando, a parte de sinalização teria que ser feita enquanto o thread ainda estava em execução e o planejador do sistema operacional poderia decidir para colocar o thread em repouso por uma hora logo após a sinalização ser executada sem a possibilidade de a extremidade de recebimento detectar com segurança que a thread realmente terminou.

Se ficar semmain() com segmentos desanexados executando comportamento indefinido, entãoqualquer uso destd::thread::detach() é um comportamento indefinido, a menos que o thread principal nunca saia2.

Assim, ficando semmain() com segmentos desanexados em execução deve terdefiniram efeitos. A questão é:Onde (noPadrão C ++, não POSIX, não docs do SO, ...) são aqueles efeitos definidos.

2 Uma thread desanexada não pode ser unida (no sentido destd::thread::join()). Vocêposso esperar por resultados de threads desanexados (por exemplo, por meio de um futuro destd::packaged_task, ou por um semáforo de contagem ou uma bandeira e uma variável de condição), mas isso não garante que othread terminou de executar. De fato, a menos que você coloque a parte de sinalização no destruidor do primeiro objeto automático do encadeamento,vai, em geral, ser código (destruidores) que são executadosdepois de o código de sinalização. Se o SO programar o thread principal para consumir o resultado e sair antes que o thread desanexado conclua a execução dos ditos destruidores, o que o * Wis definido para acontecer?

questionAnswers(5)

yourAnswerToTheQuestion