Как отмечено @R .. в комментариях, это выглядит как ошибка в реализации glibc (если вы используете Linux - я могу воспроизвести это на Linux 2.17, скомпилированном с GCC 4.9.1), в том, что exit()
не обеспечивает, в то время как поток смыва и закрытия, нет гонки, когда он вызывается одним потоком, когда несколько потоков используют stdout.
Ниже из руководства flockfile
ясно указывает, что наблюдаемое поведение неверно:
Функции stdio являются потокобезопасными. Это достигается путем присвоения каждому объекту FILE блокировки и (если номер блокировки отличен от нуля) принадлежащего потоку. Для каждого вызова библиотеки эти функции ждут, пока объект FILE больше не будет заблокирован другим потоком, затем заблокирует его, выполнит запрошенный ввод-вывод и снова разблокирует объект.
В В свете этого, следующие варианты можно рассматривать как обходные пути (так как ответа на отчет об ошибке нет) в этом конкретном случае, который мы здесь наблюдаем.
Оба потока «делят»
stdout
, и я думаю, что «дополнительный» вывод печатается из-за преждевременного выхода основного потока.
printf
буфера (вsample_thread()
) вывод и до того, как он сможет очистить его буфер ( из-за\n
в printfs), основной поток завершается. Следовательно, принудительное удаление буфераstdout
при выходе из процесса.Чтобы исправить,
1), вы можете вызвать
setbuf()
вmain()
перед созданием потока:setbuf(stdout, NULL);
в не buffer
stdout
.Или 2) вызовите
pthread_exit()
в обоих потоках, чтобы процесс продолжался, если нить умирает .Или 3) вызовите
pthread_join()
в основном потоке, чтобы основной поток ожидал завершения потокаsample_thread
.Любой из них избежит проблемы.
Из веб-сайт :
Apache® Ignite ™ первоначально был внесен в Apache Software Foundation GridGain Systems. Проект быстро превратился в проект Apache высшего уровня с десятками тысяч загрузок в месяц. GridGain Professional Edition, Enterprise Edition и Ultimate Edition построены на Apache Ignite.
В выпусках Enterprise и Ultimate есть некоторые «корпоративные» функции, которые не находятся в версии с открытым исходным кодом.