Убедитесь, что все Printf в потоке - PullRequest
1 голос
/ 31 марта 2011

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

Это тема, о которой идет речь:

void* troutine(void* tmp) {
    a = RDTSC();
    chance = Park(state);
    b = RDTSC();

    printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);


    usleep(RAND(50));

    a = RDTSC();
    Leave(chance, state);
    b = RDTSC();
    printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);

    fflush(stdout);
    pthread_exit(NULL);
}

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

РЕДАКТИРОВАТЬ main.c

for(i = 0; i < 4000; i++) 
    while(!pthread_create(&tmp, NULL, &troutine, (void*)&testNum));

Цикл while таков, что я гарантирую создание потоков 4k, так как иногда pthread_create завершается ошибкой с таким количеством активных потоков.Кроме того, даже когда я только устанавливаю цикл, чтобы сделать <4 потока, я все равно получаю ~ 300 строк вывода (в отличие от 8).</p>

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

(1) Вы выпадете из main () до окончания ваших потоков. Либо присоединяйтесь к потокам, либо поместите pthread_exit () в main (), чтобы он не убивал ваши запущенные потоки при выходе.

for(i = 0; i < 4000; i++) 
    while(!pthread_create(&tmp, NULL, &troutine, (void*)&testNum));

(2) Pthread_create возвращает 0 в случае успеха. Таким образом, приведенный выше цикл while гласит: «Пока успешно, продолжайте создавать потоки». Это объяснило бы такой большой результат, когда мне всего 4.

1 голос
/ 31 марта 2011

Редактировать 2: Другая возможность состоит в том, что ваша проблема находится за пределами этого кода, и что-то вызывает exit (если не происходит сбой), так что половина ваших потоков никогда не завершится. Это действительно помогло бы узнать больше о том, что вы подразумеваете под «отсечкой».


[Как упоминает R, в этом не должно быть необходимости. Только оставляя это, чтобы ветка комментариев имела смысл.]

Когда вы говорите, что используете блокировку, используете ли вы какой-то глобальный мьютекс, например:

pthread_mutex_lock(mutex);
printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);
pthread_mutex_unlock(mutex);

потому что я не вижу этого в вашем примере. Обратите внимание, что mutex необходимо определить в приведенном выше примере, а также указатель.

...