Передача char [N] в качестве аргумента потока в c? - PullRequest
1 голос
/ 08 июля 2010

Вот мой код:

void *PrintLine(void *line)
{
    printf("Line: #%s\n", (char *)line);
    pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
    char line[80];
    while(fgets(line,sizeof(line),fp))
    {
        pthread_create(&threads[rt], NULL, PrintLine, (void*)line);
    }
    fclose(fp);
}

Пожалуйста, не говорите мне, что запуск потока только для печати строки файла не имеет смысла, я удалил много кода, чтобы его было легче читатьи понимаю мою проблему.

Как вы могли догадаться, этот код не работает, что я должен сделать, чтобы иметь возможность печатать / использовать "строку" внутри потока?

Ответы [ 4 ]

3 голосов
/ 08 июля 2010

Вы передаете указатель на line недавно созданному потоку, когда ваш поток начинает использовать line, perhapse fgets написал что-то еще для него. Или, возможно, он находится в процессе написания чего-либо, когда ваш поток обращается к нему.

Вы можете передать копию прочитанной строки, запомните free(), когда закончите с ней в вашей ветке.

char *copy_of_line = strdup(line);
if(copy_of_line)
  pthread_create(&threads[rt], NULL, PrintLine, copy_of_line);
2 голосов
/ 08 июля 2010

Вам нужно pthread_join(3) в потоке main, чтобы дождаться завершения каждого потока, который вы породили.В противном случае основной поток может завершить процесс , прежде чем другие потоки смогут выполнить печать (а также убедиться, что объем стековой памяти, на которую вы указываете порожденные потоки, все еще находится в области действия).Редактировать:

Затем опубликовать «реальный» код или хотя бы «рабочий» код.Мы не читатели разума.

Другая очевидная ошибка заключается в том, что основные потоки переопределяют буфер, который должны печатать другие потоки.Нет гарантии, что в какой-то момент строка в этом буфере не будет оканчиваться нулем.Вам действительно нужно сделать копию в главном потоке , прежде чем передавать ее другим потокам.

0 голосов
/ 08 июля 2010

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

0 голосов
/ 08 июля 2010

Две сразу очевидные проблемы:

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