PTHREAD

1. PTHREAD

ale
aoshi001

(usa Kurumin)

Enviado em 18/09/2008 - 12:39h

Caros
To tentando executar esse programa aqui .

quando compilo no gcc no ambiente windows, ta dando a msg abaixo, o que eu preciso fazer para resolver.

C:\trabalhosistema>Gcc -o tp1 -lpthread tp1.c
Gcc: ûo: No such file or directory
Gcc: tp1: No such file or directory
Gcc: ûlpthread: No such file or directory
tp1.c:3:21: pthread.h: No such file or directory
tp1.c:14: error: syntax error before "threads"
tp1.c:14: warning: data definition has no type or storage class



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


#define NUMTHREADS 2
#define VETSIZE 5000

typedef struct
{
int fromidx, length;
}thread_arg, *ptr_thread_arg;

pthread_t threads[NUMTHREADS];
thread_arg arguments[NUMTHREADS];

int nums[VETSIZE];
int sum;

void *thread_func(void *arg);

int main(int argc, char **argv)
{
int i, length, remainder;

for(i=0; i< VETSIZE ; i++)

nums[i] = (int)( drand48() *100.0 );

sum = 0; length = VETSIZE / NUMTHREADS;
remainder = VETSIZE % NUMTHREADS;


for(i=0; i<NUMTHREADS; i++)
{
arguments[i].fromidx = i * length;
arguments[i].length = length;
if(i == (NUMTHREADS - 1))
arguments[i].length += remainder;
pthread_create(&(threads[i]), NULL, thread_func,&(arguments[i]));
}

for(i=0; i<NUMTHREADS; i++)
{
pthread_join(threads[i], NULL);
}
printf("A soma dos numeros do vetor eh %d\n", sum);
}

void *thread_func(void *arg)
{
ptr_thread_arg argument = (ptr_thread_arg)arg;
int i, localsum = 0, endidx;
endidx = argument->fromidx + argument->length;
for(i=argument->fromidx; i<endidx; i++)
{
localsum += nums[i];
}
sum += localsum;
}




  


2. Re: PTHREAD

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 18/09/2008 - 16:21h

Vamos aos comentários:
C:\trabalhosistema>Gcc -o tp1 -lpthread tp1.c
gcc é com letra minúscula. Lembre-se: C é case sensitive
include <stdlib.h>
Está faltando algo nessa linha não? Lembre do cerquilha(jogo-da-velha, ou qualquer nome), é necessário.

No mais, somente isso.

Abraços


3. Re: PTHREAD

ale
aoshi001

(usa Kurumin)

Enviado em 18/09/2008 - 16:37h

O codigo ta OK, na preça que eu esqueci de colocar # no include .

continua dando o mesma coisa.

compilei com Gcc –o tp1 –lpthread tp1.c


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


#define NUMTHREADS 2
#define VETSIZE 5000

typedef struct
{
int fromidx, length;
}thread_arg, *ptr_thread_arg;

pthread_t threads[NUMTHREADS];
thread_arg arguments[NUMTHREADS];

int nums[VETSIZE];
int sum;

void *thread_func(void *arg);

int main(int argc, char **argv)
{
int i, length, remainder;

for(i=0; i< VETSIZE ; i++)

nums[i] = (int)( drand48() *100.0 );

sum = 0; length = VETSIZE / NUMTHREADS;
remainder = VETSIZE % NUMTHREADS;


for(i=0; i<NUMTHREADS; i++)
{
arguments[i].fromidx = i * length;
arguments[i].length = length;
if(i == (NUMTHREADS - 1))
arguments[i].length += remainder;
pthread_create(&(threads[i]), NULL, thread_func,&(arguments[i]));
}

for(i=0; i<NUMTHREADS; i++)
{
pthread_join(threads[i], NULL);
}
printf("A soma dos numeros do vetor eh %d\n", sum);
}

void *thread_func(void *arg)
{
ptr_thread_arg argument = (ptr_thread_arg)arg;
int i, localsum = 0, endidx;
endidx = argument->fromidx + argument->length;
for(i=argument->fromidx; i<endidx; i++)
{
localsum += nums[i];
}
sum += localsum;
}






4. Re: PTHREAD

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 18/09/2008 - 17:59h

o que ocorre é que o port do gcc para windows (mingw32) utiliza o padrão win32 e não o posix para threads - observe inclusive que o compilador sequer encontra pthread.h, pois a w32api nativa do mingw não a inclui.

o mais "elegante" seria portar seu código utilizando as apis win32 para gerência de tarefas, ou ainda efetuar alguma gambiarra, mas que no final das contas não seria o esperado.
a solução mais "bizarra" seria compilar o próprio gcc ativando suporte posix no mingw32 através de --enable-threads=posix. porém, por experiência própria, é uma tarefa penosa, insatisfatória e não recomendável, além de exigir ser construído através de um cross compiler hospedado em uma plataforma puramente posix (ou quase).


5. Re: PTHREAD

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 18/09/2008 - 18:42h

Nosso colega tem razão.

Busca na net sobre thread em windows.
Faz muito tempo que não uso thread em windows, mas lembro algumas coisas como:

Inclua
#include <windows.h> no lugar de #include <pthread.h>

se não me engano é necessário outras bibliotecas como:
#include <process.h>

inclua
#define WIN32_LEAN_AND_MEAN
acho que é isso, antes dos .h para evitar monte de coisa que você não quer, já que a windows.h é muito grande.

no windows também não se usa
pthread_create e sim _beginthread

tem mais coisas que não lembro, como disse, faz uma busca na net.



6. Re: PTHREAD

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 18/09/2008 - 19:20h

segue o "link do mal":

http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx

(copie e cole... sai quebrado aqui no vol)


7. PTHREAD

Rafael Amaral de Oliveira
rafaelfatepi

(usa Ubuntu)

Enviado em 28/10/2010 - 11:05h

bom dia!

se voce esta usando o gcc -o tp1 -lpthread tp1.c e esta dando erro, tente usar comando make ex: make -f mkfile_tp1 (mkfile_tp1 é arquivo que voce cria com todos os parametros para compilar o codido). O livro C completo e Total cap 26 pág 703 ensina como trabalhar com make. Espero ter ajudado!