fclose зависает после клонирования потоков в Linux - PullRequest
0 голосов
/ 10 февраля 2012

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

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

Ниже приведена последовательность:

FILE * fid = fopen("filename", "w");
...
for(int i=0; i<4; i++){
clone((int (*)(void*))do_work, stack[i], CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|SIGCHLD|CLONE_CHILD_CLEARTID|CLONE_PARENT_SETTID|CLONE_IO, NULL, &(ctid[i]), NULL, &(ctid[i]) );
}
...
fclose(fid);

Non thread имеет дело с fid.

Из strace программа зависает в futex в ожидании "main_arena".Я думаю, что это должен быть некоторый мьютекс внутри glibc.

Backtrace:

#0  0x0000003f09edf9ee in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x0000003f09e76d31 in _L_lock_5478 () from /lib64/libc.so.6
#2  0x0000003f09e71c8d in _int_free () from /lib64/libc.so.6
#3  0x0000003f09e7273b in free () from /lib64/libc.so.6
#4  0x0000003f09e60d5b in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6

Это происходит в Linux с glibc 2.5, но не в Linux с glibc 2.12.

Iмне интересно, потому что мы не можем создавать потоки, используя clone (), как это.В NPTL много чего еще сделано, например set_robust_futex () и настройка локального хранилища потока.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 декабря 2015

Какая у вас версия ядра?

Кажется, ошибка в ядре.

см. ошибка futex_wait и исправление ядра для получения дополнительной информации.

0 голосов
/ 10 февраля 2012

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

...