declarada.(&minhaThread)O segundo arrgumento e um ponteiro que define os atributos da thread. Para valores padrao, NULL deve ser passado (NULL)O terceiro argumento e a funcao que voce ira passar para a thread que se criara e executara a partir de agora.Para o exemplo consumidor/produtor e de suma importancia que sua funcao retorne um ponteiro de void.(explicado melhor adiante)Neste parametro voce nao deve incluir nada alem do nome da funcao (que ja deve estar declarada, ne?) (minhaFuncao).O quarto parametro esta relacionado aos parametros que estaremos passando para nossa funcao.Nao irei muito alem neste ponto, pois para entender este argumento voce deve entender sobre troca de mensagens entre processos e isto e uma longa historia(que veremos com o professor Botega mais adiante) Aqui passaremos uma referencia(&) para um inteiro qualquer (que voce tambem ja declarou, ne?) que servira como identificador para nossa thread, junto com um casting(coercao) de tipo para ponteiro nulo ((void *) &meuArgumento)Se voce foi um bom menino e seguiu meus passos ate aqui, voce ja possui uma funcao assim:void * minhaFuncao (int * meuArgumento){ blablabla. sem_wait(&meuSemaforo) regiao critica; sem_post(&meuSemaforo)}E tambem possui uma main() mais ou menos assim :void main (){ int meuArgumento1=1,meuArgumento2=2; sem_init(&meuSemaforo,0,1); pthread_t minhaThread1,minhaThread2; pthread_create(&minhaThread1, NULL, minhaFuncao , (void *) &meuArgumento1); pthread_create(&minhaThread2, NULL, minhaFuncao , (void *) &meuArgumento2);}Se voce entendeu meu raciocinio ate aqui, conseguiu compilar tudo, porem quando executa o programa executa e fecha rapidamente, pensa comigo.Se todo processo tem pelo menos uma unica thread, e esta thread principal termina sua execucao, o processo acaba ,certo? Se um processo acaba, ele acaba com todas as coitadinhas que estavam la em seu laco infinito trabalhando. Culpa de quem? Culpa do seu S.O. que nem faz ideia do que voce estava fazendo dentro de seu processo. Ele nao conhece suas threads. Quando nosso programa chega ao fim da main e isto que acontece. O processo todo termina e nossas threads vao pro saco. Para que isto nao ocorra nos fazemos uma grande P.O.G. (Programacao Orientada a Gambiarra, para os nao intimos). Simplesmente falamos para o nosso processo - Ei, essa sua thread principal (main()) ja era, pegue uma de nossas threads para continuar com o programa.E utilizando o seguinte comando, ele atende nosso pedido:pthread_exit(NULL);Sendo assim, sua main() deve estar parecida com isto:void main (){ int meuArgumento1=1,meuArgumento2=2; sem_init(&meuSemaforo,0,1); pthread_t minhaThread1,minhaThread2; pthread_create(&minhaThread1, NULL, minhaFuncao , (void *) &meuArgumento1); pthread_create(&minhaThread2, NULL, minhaFuncao , (void *) &meuArgumento2); pthread_exit(NULL);}Bom, felizmente e isto que posso fazer por voces por hora, pois mais do que isto seria contribuir para a retirada do seu diploma de bacharelado. E a intencao nao e esta, e sim promover o conhecimento mutuo, pois eu tambem poderei e vou, precisar de voces adiante.Tambem espero poder contar com voces para a divulgacao do blog, bem como a avaliacao de voces nesta pagina. Comentarios serao bem-vindos e respondidos.Um grande abracoEu =)PS. Para uma referencia completa as bibliotecas acesse:<semaphore.h>http://pubs.opengroup.org/onlinepubs/000095399/basedefs/semaphore.h.html<pthread.h>http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html