2016-05-22 12 views
0

私は2つのファイル(.c)を1つのテスト(test.c)とtest.cに持っています。私はプログラムのmain関数を入れて、test.cに含まれている別のファイルを持っています。私はtest.cのスレッドを実行しないでください実行します。しかし、私が主要な機能のスレッドを定義するなら、それは正しいです。今私は他のヘッダーファイルでスレッドを使用できるのか知りたいですか?他のヘッダファイルにスレッドを実行できますか?

これは私のメインのコードです:

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; 
} 

と、これは私のスレッドファイルです:私が正しくあなたの質問を理解している場合 (いくつかの不要な機能が削除されます)

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

質問は私には非常に明確ではありません。しかし、一般的に1.)は.cから.cを含んでいません。 2.)ヘッダー(.h)に実行されるコードを入れない。 – alk

+0

問題のあるコードを表示してください。あなたがコードを置く場所は、通常、効果がありません。 – fuz

+0

私は "ThredFunc"が何かをディスプレイに表示することを期待しましたが、それはしませんでした。 – Mehdi

答えて

0

、あなたが定義したいです他のファイル(test.c)のスレッドをメインファイル(main.c)で実行します。その場合、 "test.h"にmain.cとtest.cのtest.hを含めたいとします。その後

#include "test.h" 

あなたはtest.cの中の関数を定義し、test.h.でそれらを宣言する

test.hには#ifndefが必要です。

そして、Makefileでそれを含める:

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

ありがとうございますが、これは私の問題ではありません。 – Mehdi

関連する問題