Страницы

Поиск по вопросам

среда, 10 апреля 2019 г.

Передача двух массивов в поток

Имеется 2 структуры (2 динамических массива), в каждой свой набор данных. Появилась потребность перенести одну из функций в поток с помощью pthread_create (функцию change).
Не могу понять, как можно передать ссылки на эти 2 структуры в данную функцию (в потоке), чтобы в ней я смог провести какие-нибудь операции у данных структур и с этими изменениями я мог дальше работать в основной программе?
Спасибо.
Пример программы.
#include #include #include #include #include #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 #include #include #include #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$

Комментариев нет:

Отправить комментарий