Имеется 2 структуры (2 динамических массива), в каждой свой набор данных. Появилась потребность перенести одну из функций в поток с помощью pthread_create (функцию change).
Не могу понять, как можно передать ссылки на эти 2 структуры в данную функцию (в потоке), чтобы в ней я смог провести какие-нибудь операции у данных структур и с этими изменениями я мог дальше работать в основной программе?
Спасибо.
Пример программы.
#include
struct strc {
char str[60];
int uid;
struct strc *prev;
};
struct param {
struct stack *elma;
struct stack *elmb;
};
struct stack *add(struct stack **base, char *line,int uid) {
struct stack *element=(struct stack*)malloc(sizeof(struct stack));
element->prev=*base;
strcpy(element->data,line);
element->uid=uid;
return element;
}
int search(struct stack *base,char *str) {
while (base!=NULL) {if (strcmp(base->data,str)==0) return base->uid; base=base->prev;}
return 0;
}
void * change(void *arg) {
struct param *data=arg;
*data.elma=add(data.elma,"chips",5);
*data.elmb=add(data.elmb,"volvo",2);
}
int main() {
int uid;
pthread_t thread;
struct strc *elma=NULL;
struct strc *elmb=NULL;
struct param *arg;
arg->elma=elma;
arg->elmb=elmb;
if (pthread_create(&thread, NULL, change, &arg) != 0) {return -1;}
uid=search(elma,"chips");
printf("%i",uid);
uid=search(elmb,"volvo");
printf("%i",uid);
}
Ответ
Поправил Ваш пример до работоспособного состояния.
#include
#include
struct stack {
char data[60];
int uid;
struct stack *prev;
};
struct param {
struct stack **elma;
struct stack **elmb;
};
struct stack *add(struct stack **base, char *line,int uid) {
struct stack *element=(struct stack*)malloc(sizeof(struct stack));
element->prev=*base;
strcpy(element->data,line);
element->uid=uid;
return element;
}
int search(struct stack *base,char *str) {
while (base!=NULL) {
if (strcmp(base->data,str)==0)
return base->uid;
base=base->prev;
}
return 0;
}
void * change(void *arg) {
struct param *data=arg;
*(data->elma) = add(data->elma, "chips", 5);
*(data->elmb) = add(data->elmb, "volvo", 2);
*(data->elma) = add(data->elma, "flips", 15);
*(data->elmb) = add(data->elmb, "ford", 21);
}
int main()
{
int uid;
pthread_t thread;
struct stack *elma=NULL;
struct stack *elmb=NULL;
struct param arg;
arg.elma=&elma;
arg.elmb=&elmb;
if (pthread_create(&thread, NULL, change, &arg) != 0)
exit((puts("Can't create thread"), 1));
// тут делаете что-то полезное, \
пока не понадобятся данные из change()
if (pthread_join(thread, 0))
exit((puts("Can't join"), 2));
uid=search(elma,"chips");
printf("chips: %i
",uid);
uid=search(elmb,"volvo");
printf("volvo: %i
",uid);
uid=search(elma,"flips");
printf("flips: %i
",uid);
uid=search(elmb,"bmw");
printf("bmw: %i
",uid);
}
По сути, заменил передачу в change() указателей на "стеки" на передачу адресов этих указателей (структура param), поскольку в main Вы явно используете elma и elmb для обращения к search() и добавил вызов pthread_join для ожидания завершения заполнения "стеков"
(естественно, добавил #include
avp@wubu:hashcode$ gcc pt.c -lpthread && ./a.out
chips: 5
volvo: 2
flips: 15
bmw: 0
avp@wubu:hashcode$
Комментариев нет:
Отправить комментарий