Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Porquê a letra B está errada?

Sei por experiência de que a resposta correta é a letra D e o fato do resultado ser um número e o C# realizar a cópia do valor ao invés de passar como ponteiro quando chamado em outros scopes ajuda a saber a resposta.

Porém: Levando em conta a resposta do professor na letra B: "e esta thread não acessa as variáveis usadas fora do escopo da função FatorialEmParalelo". Em tese, o que está na Thread está fora do scopo da thread principal. Por conta disso, mesmo com um t_calculo.wait() não era para termos o resultado da função justamente pelo fato de estar fora do escopo.

E justamente pensando em forma de Scopo: Na aula, utilizamos o método parecido com: resultados.add(resultado_processo). Por ser um objeto Lista, o C# se utiliza do valor via ponteiros. Neste caso, caso o programa principal não feche por algum motivo, o valor da variável seria atualizado porém sem ser mostrado (pois a implementação que se utiliza do dado já teria rodado). Ideia Testada e ocorre isso mesmo.

1 resposta
solução!

Olá, André.

Tudo bem?

Vamos analisar a questão que você levantou sobre a letra B e entender por que ela está errada, considerando o código e o contexto que você descreveu.

A letra B sugere que inicialmente obteremos o valor 0 e, em seguida, o valor será atualizado para 120 (5 fatorial). No entanto, isso não acontece devido à forma como as threads são gerenciadas em C#. Quando você inicia a thread t_calculo para calcular o fatorial, o método FatorialEmParalelo não espera que essa thread termine antes de retornar o resultado. Portanto, o método retorna imediatamente o valor inicial de resultado, que é 0.

A dúvida pode surgir porque, teoricamente, a thread t_calculo poderia completar sua execução imediatamente após o retorno de FatorialEmParalelo, atualizando o valor de resultado para 120. No entanto, como FatorialEmParalelo já retornou, essa atualização não afeta o valor que foi retornado. Portanto, o programa principal vê apenas o valor 0, e não há uma atualização subsequente que ele possa observar.

Além disso, você mencionou o uso de resultados.add(resultado_processo) em um contexto de lista, onde o C# gerencia os objetos por referência (ponteiros). Isso é verdade para objetos, mas no caso do seu código, resultado é um tipo de valor (long), e a thread está modificando uma cópia local desse valor, não a referência em si.

Portanto, a letra B está errada porque ela implica que há uma atualização visível do valor de resultado após o retorno do método, o que não ocorre devido ao comportamento de execução das threads e ao momento do retorno do valor na função FatorialEmParalelo.

Espero ter ajudado e bons estudos!