Problemas com a compilação de programa com THREAD

1. Problemas com a compilação de programa com THREAD

Vitor
pacheco2

(usa Ubuntu)

Enviado em 03/06/2012 - 14:12h

Olá pessoal,

Estou com um problema para compilar um simples programa meu para executar uma thread

Segue o programa abaixo:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

void* filho(){
printf("Iniciando Filho.\n");
sleep(5);
printf("Encerrando Filho.\n");
}

int main(){
pthread_t id_thread;
system("clear");
printf("Iniciando Pai.\n");
pthread_create(&id_thread, NULL, &filho, NULL);
printf("Encerrando Pai.\n");
return 0;
}

quando eu tento compilalo por g++ prog01.cpp -o prog01 -lpthread fala que contem items sem declarar no meu programa, será que vocês poderiam me ajudar com isso por favor?

Desde ja agradeço a atenção.


  


2. Re: Problemas com a compilação de programa com THREAD

Carlos Lint
lint

(usa Slackware)

Enviado em 03/06/2012 - 17:58h

Tem dois problemas no seu código:

A declaração do thread filho deve passar um ponteiro void, o que é diferente de simplesmente void.
void* filho() é o mesmo que void* filho(void), mas ambos são diferentes de void* filho(void *argumento), o segundo aceita um ponteiro como argumento.

Fora isso é apropriado incluir a unistd.h, para que você possa usar a função sleep().

Segue o código que eu compilei aqui:


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

void* filho(void *arg){
printf("Iniciando Filho.\n");
sleep(5);
printf("Encerrando Filho.\n");
}

int main(){
pthread_t id_thread;

system("clear");
printf("Iniciando Pai.\n");
pthread_create(&id_thread, NULL, filho, NULL);
printf("Encerrando Pai.\n");
return 0;
}


Mas veja que o thread filho possivelmente nunca vai executar, pois o thread principal (pai) acaba poucos instantes depois do spawn do thread filho, e o filho morre por tabela, pelo menos é homicídio culposo.
Se você colocar um sleep(6) no final do programa você deve ver a saída que você está esperando afterall...



3. Re: Problemas com a compilação de programa com THREAD

Vitor
pacheco2

(usa Ubuntu)

Enviado em 03/06/2012 - 19:14h

Adicionei o parêmtro na função filho e a biblioteca unistd.h e deu certo lint, vlw pela ajuda, mas fiquei com uma duvida.

Você poderia me explicar pra que serve essa biblioteca e esse parametro que eu n entendi muito bem :S


4. Re: Problemas com a compilação de programa com THREAD

Carlos Lint
lint

(usa Slackware)

Enviado em 03/06/2012 - 21:06h

Bom, você adiciona essa biblioteca para que o seu programa possa usar chamadas padrões de unix, cada compilador fornece uma unistd.h diferente, mas todas as chamadas são idênticas (supondo que o compilador seja compatível com o padrão POSIX.1. O C sozinho não faz praticamente nada, o "sleep()" por exemplo não está incluso no C por padrão, ele só fica disponível depois que você inclui a biblioteca unistd.h, sacou?
Assim como outras funções como open, getpid ou chdir.

Já a respeito do parâmetro, a função pthread_create espera que você passe os argumentos de acordo com o que ela espera, por exemplo, se você chamar uma função como "int atoi(char *string)" e passar um parâmetro que não seja "char *string" ele vai reclamar, pois possível/provavelmente você está fazendo besteira, se não estiver você pode ou declarar a variável (nesse seu caso é uma função, mas se aplica da mesma forma que uma variável) ou usar um type cast.

Creio que seja possível que o compilador ignore esse erro e compile o código mesmo que o protótipo da função especifique algo diferente do que você está passando (com o switch -Wnone), mas ele está lá pro seu bem, acredite.


5. Re: Problemas com a compilação de programa com THREAD

Marcos Antonio
marcosjk20

(usa Slackware)

Enviado em 17/10/2012 - 21:47h

Ola pessoal vi o forum de voces sobre THREAD e estou com um problema parecido, tenho esse codigo

#include <stdio.h>
#include <pthread.h>

void *imprime_mensagem(void *ptr);

int main()
{
pthread_t t1, t2;

char *msg1 = "primeiro";
char *msg2 = "segundo";

pthread_create(&t1, NULL, imprime_mensagem, (void*)msg1);
pthread_create(&t2, NULL, imprime_mensagem, (void*)msg2);



return 0;
}

void *imprime_mensagem(void *ptr)
{
char *mensagem = (char *)ptr;
printf("%s", mensagem);
return NULL;
}


pra mim consegui executar ele tenho que acrescentar as linhas pthread_join(&t1,NULL); e pthread_join(&t2,NULL); porem esta dando erro ao compilar alguem sabe o que pode ser?







6. Re: Problemas com a compilação de programa com THREAD

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2012 - 22:21h

Como o primeiro argumento de pthread_join() é um pthread_t, e não um pthread_t*, tire o & que você colocou antes de t1 e t2.


7. Re: Problemas com a compilação de programa com THREAD

Marcos Antonio
marcosjk20

(usa Slackware)

Enviado em 18/10/2012 - 19:40h

Bingo Paulo e isso mesmo deu certo

vlw pela ajuda

abracos






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts