Подтвердить что ты не робот

Передача структур в качестве аргументов при использовании pthread_create()

Я попытался передать структуру в качестве 4-го аргумента при использовании pthread_create() с чем-то вроде этого:

pthread_create(&tid1, NULL, calca, &t); //t is the struct

Теперь, когда я пытаюсь получить доступ к переменным в структуре - t.a, t.b или t.c, я продолжаю получать запрос ошибки для члена в чем-то, что не является структурой или объединением.

Какой альтернативный метод я могу использовать для передачи структур в поток?

4b9b3361

Ответ 1

Вероятно, вы создаете структуру в той же области, что и pthread_create. Эта структура больше не будет действительна после выхода этой области.

Попробуйте создать указатель на структуру в куче и передать этот указатель структуры на ваш поток. Не забудьте удалить эту память где-нибудь (в потоке, если вы никогда не будете использовать ее снова - или когда вам это больше не понадобится).

Кроме того, как упоминалось в cyberconte, если вы собираетесь получать доступ к этим данным из разных потоков, вам необходимо заблокировать доступ к нему с помощью мьютекса или критического раздела.

Редактировать Май 14th, 2009 @12:19 PM EST: Кроме того, как говорили другие люди, вам нужно указать свой параметр на правильный тип.

Если вы передаете переменную, которая является глобальной структурой (на которую вы, похоже, настаиваете), ваша функция потока должна будет указывать на тип:

void my_thread_func(void* arg){
    my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

Или, если вы передаете указатель на свою структуру:

void my_thread_func(void* arg){
    my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */
    /* Access foo->a, foo->b, foo->c, etc. here */
}

Ответ 2

Если вы находитесь внутри вашей функции потока, аргумент, который вы передаете, является void *. Вам нужно будет передать его в структуру, прежде чем вы сможете использовать ее как таковой.

void my_thread_func(void* arg){
    my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

Ответ 3

  • Создать семафор

  • Создайте еще одну структуру, которая состоит из указателя на вашу структуру и дескриптора семафора

  • Передайте указатель на эту новую структуру в pthread_create

  • В родительском потоке, т.е. вызванном pthread_create, подождите на семафоре

  • В дочернем потоке скопируйте элементы вашей структуры в локальные переменные или сохраните их в другом месте

  • В дочернем потоке передайте семафор

  • В родительском потоке закройте семафор

Ответ 4

Вы можете использовать общую память или глобальную переменную (если ничего не потребуется для этого аргумента) или связанный список, если это потоки, которые подают данные.

Не забудьте заблокировать переменные, которые разделяются потоками.

Без фактического кода нарушения, однако, я не могу сказать вам, что вы делаете неправильно в своей текущей реализации.

Ответ 5

Это сообщение об ошибке означает, что вы не разыскиваете указатель.

Вы говорите "t.a" вместо "t- > a"

[[email protected] ~]$ cat testitx.c
struct x {
        int a, b;
};

int main(int argc, char *argv[])
{
        struct x y, *z;

        z = &y;
        z.a = 10;
}
[[email protected] ~]$ cc -c testitx.c
testitx.c: In function `main':
testitx.c:10: error: request for member `a' in something not a structure or union
[[email protected] ~]$

Ответ 6

Я часто использовал одни и те же ошибки, перечисленные в других ответах, но теперь я использую несколько иной подход, который переносит потенциал ошибки от функции потоковой передачи на вызов pthread_create.

Я объявляю и определяю функцию потоковой передачи "обычным" способом:

void *ThreadFunction(sPARAMETERS *Params) {

  // do my threading stuff...

}

и когда я вызываю pthread_create, мне нужно использовать cast:

pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params);

Я почти никогда не забываю использовать и на Params, и компилятор позаботится о любых ошибках, которые я делаю на другом конце. Отлично подходит для обратных вызовов.

Ответ 7

my_struct foo = (my_struct) (* arg); интроект пытаться my_struct * foo = (my_struct *) (arg);
И, int функция Вызов темы, убедитесь, что его статический (так что указана память, не пропадает в тумане)