2016-09-19 73 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