2012-07-03 1 views
1

См. Мой псевдокод ниже. Комментарии кодов должны объяснить мою проблему. Я новичок в обоих pthreads и связанных списках на C, поэтому я немного вскочил в глубокий конец. Мне просто нужно напечатать значение str в функции thread_work. Последовательный бит кода хорош, но когда каждый поток выполняет свою работу, он не может распечатать значение str.Правильно пересылает узел связанного списка в функцию pthread

// linked list definition 
struct linked_list { 
    char *str; 
    struct linked_list *next; 
}; 

// linked list initiation 
struct linked_list *root; 
struct linked_list *next_info; 
root = malloc(sizeof(struct linked_list)); 

// main code 
some loop { 
    next_node->str = str; 
    printf("%s\n", next_node); // PRINTS FINE 
    pthread_t thread; 
    rc = pthread_create(&thread, NULL, thread_work, (void *) &next_node); 
    next_node->next = malloc(sizeof(struct linked_list)); 
    next_node = next_node->next; 
} 

// code executed by each thread 
void *thread_work(void *thread_arg) { 
    struct linked_list *ll; 
    ll = (struct linked_list *)thread_arg; 
    printf("%s\n", ll->str); // PRINTS SOME MESS (��E#) 
} 

В моем фактическом коде есть несколько членов linked_liststruct.

Большое спасибо.

+1

Только примечание: так как '' thread_arg' является недействительным * ', нет абсолютно никакой необходимости, чтобы бросить при переходе на другой тип указателя данных. Просто сделайте это: 'struct linked_list * ll = thread_arg;" '. – unwind

ответ

2

У вас есть несоответствие типа указателя: вы передаете указатель на указатель на узел списка, но внутри thread_work вы рассматриваете его как указатель на узел. Либо удалите амперсанд перед тем next_node в вызове pthread_create или изменить thread_work следующим образом:

void *thread_work(void *thread_arg) { 
    struct linked_list **llp, *ll; 
    llp = (struct linked_list **)thread_arg; 
    ll = *llp; 
    printf("%s\n", ll->str); // PRINTS SOME GOOD STUFF 
} 
+0

СПАСИБО. Я отмечу это как решение, тогда минимальное время истекло. – ale

0

если printf("%s\n", next_node) работает отлично, next_node является указателем и для этого вы schouldn't точку указателя в pthread_create(). Определение next_node бы неплохо;)

попробовать rc = pthread_create(&thread, NULL, thread_work, (void *) next_node);

0

Этот код плох:

// main code 
some loop { 
    next_node->str = str; 
    printf("%s\n", next_node); // PRINTS FINE 
    pthread_t thread; 
    rc = pthread_create(&thread, NULL, thread_work, (void *) &next_node); 
    next_node->next = malloc(sizeof(struct linked_list)); 
    next_node = next_node->next; 
} 

Проблема здесь состоит в том, что вы передаете указатель на переменную, чье значение изменяется немедленно после звонка до pthread_create. Поскольку для клонирования процесса в новый поток требуется некоторое время, фактический thread_work может (и в большинстве случаев будет) запускаться после выполнения инструкции next_node = next_node->next; и выбрать неправильное значение next_node. Вы должны передать значение из next_node, а не его адрес:

// main code 
some loop { 
    next_node->str = str; 
    printf("%s\n", next_node->str); // PRINTS FINE 
    pthread_t thread; 
    rc = pthread_create(&thread, NULL, thread_work, (void *) next_node); 
    // Store this thread handle somewhere safe to be able to join the thread later on 
    next_node->next = malloc(sizeof(struct linked_list)); 
    next_node->next->str = next_node->next->next = NULL; // Always a good idea 
    next_node = next_node->next; 
} 
Смежные вопросы