2016-05-22 7 views
0

Ich habe 2 Dateien (. C) eine für test (test.c) und in test.c Ich habe Hauptfunktion des Programms und auch ich habe eine andere Datei, die in test.c enthalten und in dem ich Threads erstellt, aber wann Ich lasse test.c Threads nicht laufen. Aber wenn ich Threads in der Hauptfunktion definiere, ist es richtig. Jetzt möchte ich wissen, können wir Thread in anderen Header-Dateien verwenden?Können wir Thread in anderen Header-Datei ausführen?

das ist mein Hauptcode:

include stdlib.h 
include stdio.h 
include time.h 
include math.h 
include "msort_pth.h" 

//Dynamically allocate an array of size N in heap 
void fillArray (int** values, unsigned int N) 
{ 
    srand(time(0)); 
unsigned int i; 
for (i=0; i<N; i++) 
    (*values)[i] = rand() - (RAND_MAX/2); 
} 

//Check to see if the sorted array is really sorted! 
void checkArray (const int* values, unsigned int N, const int* sorted) 
{ 
    unsigned int i; 
for (i=0; i <= N-2; i++) 
    if (sorted[i]>sorted[i+1]) 
    { 
    printf("ERROR i=%d %d %d", i, sorted[i], sorted[i+1]); 
    return; 
    } 
printf("OK\n"); 
    } 

int main (int argc, char* argv[]) 
{ 
    if (argc != 3){ 
    printf("Please enter: \n ./a.out M K\n"); 
    exit(1); 
} 

    //input array 
unsigned int K; 
unsigned int N; 

//Fill in the input array with random data 
K = atoi(argv[2]); 
N = pow(2, atoi(argv[1])); 
int* values = (int*) malloc (sizeof(int) * N); 
fillArray (&values, N); 

//Sorted array 
int* sorted = (int*) malloc (sizeof(int) * N); 

//Sort the input array and report its runtime 
clock_t t1 = clock(); 
mergeSortParallel (values, N, K, sorted); 
clock_t t2 = clock(); 
printf("Runtime = %g ms \n", (t2-t1)/1000.0); 

//Check for correctness 
checkArray (values, N, sorted); 

return 0; 
} 

und das ist mein Thread-Datei: (Einige unnötige Funktionen entfernt werden)

include "msort_pth.h" 
include pthread.h 
include stdio.h 
include stdlib.h 


define BLOCKSIZE 1 

int* globalValues; 
int* globalSorted; 
int* globalTemp; 
int globalN; 
int globalK; 
int thread_count; 

void merge(int A[], int B[], int N, int* sorted); 
void My_BubbleSort(const int* values, int Size, int* sorted); 
void My_Sort(const int* values, unsigned int N, int* sorted, int  BLOCK_SIZE); 
void mergeSort(const int* values, unsigned int N, int* sorted); 
void* threadFunc(void* rank); 
void mergeSortParallel (const int* values, unsigned int N, unsigned int K, int* sorted) 
{ 
globalK=K; 
globalN=N; 
globalValues=(int*)malloc(sizeof(int)*N); 
globalSorted=(int*)malloc(sizeof(int)*N); 
globalTemp=(int*)malloc(sizeof(int)*N); 
int i=0; 
for(i=0;i<N;i++) 
{ 
    globalValues[i]=values[i]; 
} 
pthread_t* thread_handles; 
long thread=0; 
thread_handles=malloc(thread_count*sizeof(pthread_t)); 
for(thread=0;thread<thread_count;thread++) 
{ 
    pthread_create(&thread_handles[thread],NULL,threadFunc,(void*)thread); 
} 

for(thread=0;thread<thread_count;thread++) 
{ 
    pthread_join(thread_handles[thread],NULL); 
} 
free(thread_handles); 



printf("GLOBAL VALUES:\n"); 
for(i=0;i<N;i++) 
{ 
    printf("%d,",values[i]); 
} 
printf("\n"); 

printf("\n"); 
printf("GLOBAL Sorted:\n"); 
for(i=0;i<N;i++) 
{ 
    printf("%d,",globalSorted[i]); 
} 



/* 
int j=0; 
int length=0; 
for(j=0;j<globalK;j++) 
{ 
      int p=globalK-j; 
    int level=pow(2,p); 
    length=globalN/level; 
    for(i=0;i<level;i++) 
    { 
     merge(globalSorted+i*length,globalSorted+(i+1)*length,length,globalTemp); 

    } 
    for(i=0;i<2*length;i++) 
    { 

    } 

} 
*/ 


} 

void* threadFunc(void* rank) 
{ 
long myrank=(long)rank; 
printf("\n MY rank is: %ld \n",myrank); 
int start=myrank*(globalN/thread_count); 
int length=globalN/thread_count; 
mergeSort(globalValues+start,length,globalSorted+start); 

return NULL; 

} 
+0

Die Frage, die mir nicht ganz klar. Im Allgemeinen 1.) wird jedoch kein .c von einem .c. 2.) man legt den auszuführenden Code nicht in einen Header (.h). – alk

+0

Bitte zeigen Sie uns den fehlerhaften Code. Wo Sie Code eingeben, hat normalerweise keine Wirkung. – fuz

+0

Ich erwartete "ThredFunc" etwas auf dem Display drucken, aber es tat es nicht. – Mehdi

Antwort

0

Wenn ich Ihre Frage richtig verstanden, Sie definieren möchten ein Thread in einer anderen Datei (test.c) und führe ihn in der Hauptdatei (main.c) aus. In diesem Fall möchten Sie "test.h" den Test.h in main.c und test.c. einschließen lassen.

#include "test.h" 

Anschließend definieren Sie die Funktionen in test.c und deklarieren sie in test.h.

test.h sollte #ifndef haben.

und es in Makefile:

debug:clean 
    $(CC) $(CFLAGS) $(CDEBUGFLAGS) -g -o main main.c test.c 
+0

Danke, aber das ist nicht mein Problem. – Mehdi