2016-09-19 39 views
0

我在嘗試向pthread_create發送多個參數時出現問題,問題基本上是因爲其中一個參數是另一個結構。從主結構中提取子結構以創建線程

這是節點。

#include <stdio.h> 
#include <string.h> 
#include <pthread.h> 
#include <stdlib.h> 
#define NUM_THREADS 4 


struct arr { 
char line[10]; 
}; 
struct args { 
struct arr record; int count; int init; int end; 
}; 

void* processarr(void *arguments) 
{ 
int count; int init; int end; 
struct args *argstmp=arguments; 
init=argstmp->init; 
count=argstmp->count; 
end=argstmp->end; 
struct arr record[count]; 
record=(struct arr)argstmp->record; 

printf("Some of the vals are init %d count %d end %d\n",init, count, end); 
printf("vals like record 0\n", record[0].line); 
pthread_exit(NULL); 
}/*end of processarr*/ 


int main (int argc, char *argv[]) 
{ 

int line_count; 
FILE *ptr_file; 
char buf[10]; 


ptr_file =fopen(argv[ 1 ],"r"); 
if (!ptr_file) 
return 1; 

while (fgets(buf,10, ptr_file)!=NULL) 
{ 
    line_count++ ; 
} 
rewind(ptr_file); 
struct arr record[line_count]; 

line_count=0; 
while (fgets(buf,10, ptr_file)!=NULL) 
{ 
    line_count++ ; 
    buf[strcspn(buf, "\r\n")] = 0; /* Removing end null chars*/ 
    strcpy(record[line_count].line,buf); 
} 


float grptmp,group, lgroup; 

grptmp=line_count/NUM_THREADS; 

int counter1,counter2,init,end; 
counter2=1; 

struct args myargs; 

//processarr(record, line_count, init, end); 
pthread_t threads[NUM_THREADS]; 


for (counter1=0;counter1<=line_count;counter1++) 
{ 
if(counter2==NUM_THREADS) 
{ 
end=line_count; 
}else{ 
end=counter1+grptmp; 
} 
init=counter1; 
myargs.record=*record; 
myargs.count=line_count; 
myargs.init=init; 
myargs.end=end; 
printf ("Run job #%d with paramts Init=%d and End=%d\n",counter2, init, end); 
//call here 
//struct arr *record; int count; int init; int end; 


    int rc; 
    long t; 
    for(t=0;t<NUM_THREADS;t++){ 

    rc = pthread_create(&threads[t], NULL,processarr,&myargs); 
    if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 

counter1=counter1+grptmp; 
counter2++; 

} 

return 0; 
} 

所以,當我把我的論點,裏面存放的myargs.record = *記錄的人,出於某種原因,我沒能在功能,一旦「解包」吧。

該函數被定義爲void,以便能夠捕捉整個大參數,並且我試圖重新映射那裏的所有東西,計數工作正常,但是一個叫做記錄,實際上是另一個結構是不工作,看起來像一個演員問題。

void* processarr(void *arguments) 
{ 
int count; int init; int end; 
struct args *argstmp=arguments; 
init=argstmp->init; 
count=argstmp->count; 
end=argstmp->end; 
struct arr record[count]; 
record=(struct arr)argstmp->record; 

printf("Some of the vals are init %d count %d end %d\n",init, count, end); 
printf("vals like record 0\n", record[0].line); 
pthread_exit(NULL); 
} 

編譯時出現以下錯誤。

test4.c: In function processarr: 
test4.c:31:7: error: assignment to expression with array type 
record=(struct arr)argstmp->record; 

任何想法爲什麼這不工作?最後一個是在argstmp前面使用cast(struct arr)的最後一次更改(它應該包含所有內容)。

+1

'record =(struct arr)argstmp-> record;'錯誤信息很清楚。您不能使用賦值運算符複製數組。無論如何,這些類型都不兼容。 'struct arr record [count];'是一個數組,但'argstmp-> record'是一個單獨的結構。 – kaylum

+0

拒絕閱讀代碼。請正確縮進。 – alk

+0

嘿馬特,我不會用你使用它們的方式來使用參數,我會改爲做這樣的事情,創建一個參數結構體,你可以從pthread中創建和解包一次,然後你不會將會與鑄件有任何問題。 – Marco

回答

0

在我的回覆中詳細闡述了一點,這就是我將使用另一個結構傳遞參數的方法。

typedef struct {char line[10];}mystruct; 
typedef struct {mystruct struct1;char line[10];}wrapper; 
struct wrapper2 {mystruct struct1;char line[10];}; 

void unwrap(struct wrapper2 args){ 
printf("val is %s\n",args.line); 
mystruct tmp=args.struct1; 
printf("val inside structure is %s\n\n", tmp.line); 
} 

int main() 
{ 
mystruct names; 
strcpy(names.line,"TEST"); 

struct wrapper2 wrapper1; 
wrapper1.struct1=names; 
strcpy(wrapper1.line,"Value1"); 
unwrap (wrapper1); 
} 

我希望這個例子可以幫助你解決這個問題,你只需要使用在pthread_create通過同樣的事情。

更新:

最後的代碼看起來是這樣的:

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


struct mystruct { 
int val; 
}; 

void * func (void *args){ 
     struct mystruct *st1=args; 
     printf("Thread created..%d\n", st1->val); 
     pthread_exit(NULL); 
} 
int main() 
{ 
/* Thread creation logic as void * (*)(void *)  

int pthread_create (pthread_t *, const pthread_attr_t *, 
        void *(*)(void *), void *); 
* */ 
struct mystruct mystruct1; 
mystruct1.val=230; 
pthread_t threads; 
pthread_create(&threads,NULL,&func,&mystruct1); 
pthread_exit(NULL); 

return 0; 
} 

我建議你閱讀在pthread_create的實際手冊。 http://man7.org/linux/man-pages/man3/pthread_create.3.html