Al enviar la señal de EOF con ctrl-d además de marcarse los bits eof y fail, también se marca el flag de error. El flujo (cin) queda bloqueado reteniendo el último ingreso. Para desbloquear el flujo cin es necesario limpiar las banderas y los flags de error después del ingreso de ctrl-d:
while(cin>>variable){
//código
}
clearerr(stdin);
cin.clear();
https://cplusplus.com/reference/cstdio/clearerr/
https://stackoverflow.com/a/65164399