LINUX.ORG.RU

проблемка с Samba (multithreading)


0

0

В общем пишу сканер сети (сканирует все smb шары - ищет файлы по заданным параметрам). Обычного сканирования мне стало мало, больно уж медленно происходит. Решил сделать его многопоточным, вот тут и появились проблемки - программа вылетает с сообщением Segmentation fault.

Схема работы функции запуска потоков такая:
- делим список хостов на несколько равных частей
- создаем обьекты-сканеры (они себе создают по одному Самба-контексту)
- создаем потоки, кот. вызывают функцию сканирования для этих обьектов
- ждем завершения потоков

Сделаю сразу несколько замечаний:
- обьекты-сканеры добавляют данные в обьект-список_файлов, метод добавления реализован в виде критической секции через мьютексы
- в потоках не вызываются никакие функции работающие с какими-либо другими общими данными
- при запуске под дебаггером, при просмотре стека, видно, что ошибка произошла в _int_malloc (), вот состояние стека на момент краха программы:

(gdb) i stack
#0 0x00587024 in _int_malloc () from /lib/tls/libc.so.6
#1 0x0058610d in malloc () from /lib/tls/libc.so.6
#2 0x00cc3f68 in Realloc (p=0x9d2a460, size=1) at lib/util.c:890
#3 0x00ced851 in cli_receive_trans (cli=0xbdd214b0, trans=50, param=0xbf289f20, param_len=0xbf289f24, data=0xbf289f28, data_len=0xbf289f2c) at libsmb/clitrans.c:202
#4 0x00cebaf1 in cli_list_new (cli=0xbdd214b0, Mask=0xbf28b840 "WINDOWS\\*", attribute=22, fn=0xc9fbb0 <dir_list_fn>, state=0x9d29f50) at libsmb/clilist.c:22
#5 0x00cec73d in cli_list (cli=0x64d300, Mask=0xbf28b840 "WINDOWS\\*",
attribute=42080, fn=0xc9fbb0 <dir_list_fn>, state=0x9d2e530)
at libsmb/clilist.c:486
#6 0x00ca04f0 in smbc_opendir_ctx (context=0x9b01358, fname=0x9d1d014 "smb://10.3.2.2//tools/WINDOWS") at libsmb/libsmbclient.c:1759
#7 0x080527c6 in ZScanFileList::scanDir(char const*, ZSMBCCTX*, ZFileValidator*, ZFeList*) (this=0x9b01300, path=0xbf28c650 "smb://10.3.2.2/", ctx=0x0, fv=0x0, fl=0x0) at zscanfilelist.cpp:91

Параметры системы:
Samba 3.0.0-15, kernel 2.4.22, gcc 3.3.2

Какие есть идеи? Может в самбе ошибка?
Заранее благодарен.


Я так понял ты используешь библиотеки от samba?
они точно thread safe ?
Постоянный ли краш или только иногда происходит?

Dead ★★★★
()
Ответ на: комментарий от anonymous

я так понял, что многопотоковый поисковик, как в Винде, сделать не получиться? Хорошо, а если не потоками пользоваться, а полноценные процессы запускать?

zhuk
() автор топика
Ответ на: комментарий от zhuk

Могу порекомендовать fork() + shared memory

причем расшаривать в твоем случае только список результатов наверное

Dead ★★★★
()

и не получится :(

наилучший выход - fork() + shared memory

я даже переписывал libsmbclient, что б он в нитях нормально пахал - заглохло на середине, пока ломает заново начинать....

fortl
()
Ответ на: комментарий от fortl

Тогда другой вопрос: эта программа работает с библиотекой QT, запускает QApplication, создаются окошки, и т.д. Сам процесс поиска запускается в отдельном потоке (чтобы графическое оформление окна не тормозило), реализованном через класс QThread.

Так вот, если я вызову fork() - произойдет полное копирование процесса, то есть со всеми динамически созданными окошками? и вообще что произойдет с потоками, которые запускались в родительском процессе? ведь потоки в линуксе - это не совсем составная часть процесса, это отдельные процессы с общей памятью. Что, потоки тоже воссоздадуться? или стоит реализовать сам движек поиска в отдельной программе, которая и будет размножаться как ей там надо...

Заранее спасибо за любые ответы на поставленные вопросы.

zhuk
() автор топика
Ответ на: комментарий от zhuk

По поводу QThread не знаю, но вызов fork() из треда ни к чему такому страшному не приводит.

Что бы не было сомнений, может стОит в самом начале программы вызвать fork() для процесса поиска и управлять им через pipes ?

Dead ★★★★
()
Ответ на: комментарий от zhuk

Ой-ой, лучше сразу разделять морду и искалку...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.