2013-10-08 4 views
0

Я тестирую поведение запуска параллельных потоков в C, с функцией потока, которая выполняется бесконечно. Мой вопрос: почему, в приведенном ниже коде, «HELLO !!!» печатается? Я думал, что pthread_create() вызывается, а затем сразу переходит к следующей итерации цикла, почему код, ожидающий завершения 1-го pthread_create()? Не должны ли одновременно выполняться несколько потоков?Выполнение параллельных потоков в C?

void main(int argc, char **argv) 
{ 
    pthread_t tid; 
    int i; 

    //Create 4 inf threads 
    for (i=0;i< 4;i++) 
    { 
     //printf("hello!\n"); 
     //pthread_create(&tid, NULL, thread_incr, (void *)i); 
     pthread_create(&tid, NULL, t_nostop, (void *)i); 
     printf("HELLO!!!"); //This linen is NEVER printed!! 
    } 

    pthread_exit(NULL); 
} 

void* t_nostop(void * argp) 
{ 
    int i=1; 
    int t_num=(int) argp; 
    while(i==1){t_num++;} 

} 

ответ

6

Несколько потоков должны запускаться одновременно. Это должно происходить в вашем коде.

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

Попробуйте либо добавить \n в конце строки, которую вы печатаете, либо добавляете fflush(stdout) после printf.

Редактировать: комментарий о линейной буферизации ...
Буферизация строк происходит, когда стандартная библиотека C решает, что записи в консоли являются относительно дорогими и должны быть предприняты только для согласованных блоков текста. Одним простым определением для когерентного блока является линия. Пока он ожидает ввода новой строки, C lib сохраняет содержимое printf вызовов в блоке памяти, добавляя последующие printf s

+1

Обратите внимание, что это будет сделано автоматически, но вы вызываете 'pthread_exit' вместо возврата от 'main'. – zch

+0

ОК спасибо, что это было! Добавлено \ n, и все работает нормально! В чем смысл буферизации строк, почему это происходит без символа newline? simonc – jerryh91

+0

Рад, что помогло. Буферизация строк происходит, когда ОС решает, что записи в консоли относительно дороги, и их следует пытаться только для согласованных блоков текста. Одним простым определением для когерентного блока является линия. Пока он ждет ввода новой строки, ОС хранит содержимое вызовов 'printf' в блоке памяти, добавляя последующие' printf '. – simonc

Смежные вопросы