Preciso criar um códgo que resolva equação de segundo grau utilizando threads. Procurando conteúdo sobre criação de threads me deparei com problema para passar as variáveis às funções threads.
Simplesmente não funciona. Alguém sabe como criar esse código? Eis o enunciado da lista:
Utilizando a linguagem C e o sistema operacional NU/Linux, desenvolva um programa que calcule as raízes, se existirem, de uma equação do segundo grau, sendo que as constantes envolvidas no cálculo deverão ser fornecidas pelo usuário via teclado. Para a resolução da equação, deve-se utilizar três processos além do processo
original. O primeiro processo será responsável por calcular o valor do delta e os demais deverão calcular as raízes da equação.
E o que você já fez?
Não sei se leu as regras do fórum, mas, não fazemos exercícios/trabalhos. Apenas ajudamos a esclarecer dúvidas específicas e pontuais a respeito de algo que você tenha construído.
Cara, posta estes tutoriais pois eu quero me atualizar. Tudo o que aprendi em C/C++ foi por água abaixo agora.
Ainda mais quando vejo que, na função
Vocẽ usa como float.
Veja, o tipo void, até onde sei, só se usa em função, pois, ele determina que uma função não retornará nenhum valor. Como você quer calcular algo com tipo vazio?
O último parâmetro é o que lhe interessa. Ele é o ponteiro que vai ser passado para a start_routine que você passa no terceiro parâmetro.
Existem algumas formas de passar valores “compostos” para sua rotina através desse ponteiro. A forma mais simples, no seu caso, é usar uma struct.
Faz o seguinte:
Cria uma struct que carrega os 3 argumentos para sua função (a, b e c);
Crie um objeto dessa struct e preencha os 3 valores com os parâmetros;
Na chamada para pthread_create, passe a struct como void* (faça um cast explícito);
Altere as assinaturas das funções calculateX1 e calculateX2 para receber apenas um parâmetro do tipo void*;
Dentro dessas funções, você vai fazer outro cast explícito de void* para a sua struct com os parâmetros;
Extraia os valores de a, b e c da struct e faça a conta que tiver que fazer.
A função pthread_createnão retorna o valor da função que você passa por parâmetro para ela.
Por isso x1 e x2 não vão ter o valor retornado pelas funções.
Você precisa colocar um outro valor dentro da struct, chamado resultado (ou algo assim). É nesse valor que as funções vão escrever o resultado final do cálculo. O problema é que você não pode acessar esse valor assim que fizer as chamadas para pthread_create, pois existe uma condição de corrida onde a thread principal pode tentar acessar os resultados antes das funções terem os escrito nas structs. Você pode resolver essa condição com um semáforo.
Outra forma de capturar o retorno das threads é usando as funções pthread_exit e pthread_join.
É difícil explicar essas coisa num post curto. Para resolver esse exercício você precisa entender muito bem como funcionam ponteiros, casting e o tipo genérico void*.
Boa sorte.
Fiz um exemplo para te ajudar a começar. Entenda e extrapole pro seu caso.