В функции потока нет my_list
. После того, как вы передали my_list
из main, вы можете получить к нему доступ через локальную переменную vargp
(что сейчас и называется my_list)
Так что вас может заинтересовать:
void *myThread(void *vargp)
{
printf("Inserting into list\n");
List_Insert(vargp, 32);
return NULL; // see man pthread_create
}
Но ... это неправильно. Потому что my_list
является локальной переменной (локальной main
). Поэтому, как только вы выйдете из основного потока, вы больше не сможете получить доступ к «my_list». Поэтому вам придется подождать, пока потоки завершат вызовы pthread_join()
для двух потоков). Для этого вам нужно будет сохранить pthread_t
идентификаторы каждого потока - в настоящее время вы перезаписываете идентификаторы потоков).
Или вам придется выделить его:
int main(int argc, char *argv[]){
//Define an empty list
list_t *my_list = malloc(sizeof *my_list);
//Initialize the list
List_Init(my_list);
//Create the threads
int i;
pthread_t tid;
for (i = 0; i < 2; i++)
pthread_create(&tid, NULL, myThread, my_list);
pthread_exit(NULL);
return 0;
}
, который вы можете free()
позже. Тогда вы сможете использовать myThread
, как указано выше.
У вас есть другие проблемы:
Атрибут destructor
сделает вызов myThread
снова в конце. Это почти наверняка не то, что вы хотите. Вы, вероятно, хотите, чтобы поток продолжался, когда основной поток завершается. Для этого достаточно набрать pthread_exit()
, как в данный момент. Поэтому просто удалите этот атрибут __attribute__((destructor))
из прототипа функции.
Вы должны избегать использования идентификатора с __
, поскольку они являются зарезервированными именами.
Ваша функция потока должна возвращать указатель (как требуется pthread_create
API).