Итак, я реализую программу с несколькими потоками (pthreads), и я ищу помощь по нескольким пунктам.Я делаю с ++ на Linux.На все остальные мои вопросы до сих пор отвечал Google, но есть еще два, на которые я не нашел ответов.
Вопрос 1 : я собираюсь сделать немногофайловый ввод / вывод и получение / обработка веб-страницы в моих темах.Есть ли способ гарантировать, что потоки будут атомарными?Я собираюсь позволить моей программе работать некоторое время, более чем вероятно, и у нее не будет заранее определенной конечной точки.Я собираюсь поймать сигнал от ctrl + c, и я хочу сделать некоторую очистку после этого и все еще хочу, чтобы моя программа распечатывала результаты / закрывала файлы и т. Д.
Мне просто интересно, если эторазумное поведение для программы, чтобы дождаться завершения потоков или, если мне нужно просто убить все потоки / закрыть файл и выйти.Я просто не хочу, чтобы мои результаты были искажены.Должен ли я / могу ли я просто сделать pthread_exit () в методе перехвата сигнала?
Любые другие комментарии / идеи по этому поводу были бы хорошими.
Вопрос 2 : Valgrindговорит, что у меня есть некоторые возможные утечки памяти.Это можно избежать, или это всегда происходит с многопоточностью в C ++?Ниже приведены два из шести или около того сообщений, которые я получаю при проверке с помощью valgrind.
Я просматривал несколько различных веб-сайтов, и один из них сказал, что некоторые возможные утечки памяти могут быть вызваны сном потока.Это не имеет смысла для меня, тем не менее, я в настоящее время сплю потоки, чтобы проверить настройки, которые у меня есть сейчас (на самом деле я сейчас не делаю никаких реальных операций ввода-вывода, просто играю с потоками).
==14072== 256 bytes in 1 blocks are still reachable in loss record 4 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400FDAC: _dl_check_map_versions (dl-version.c:300)
==14072== by 0x4012898: dl_open_worker (dl-open.c:269)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
==14072==
==14072== 630 bytes in 1 blocks are still reachable in loss record 5 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400A8AF: _dl_new_object (dl-object.c:77)
==14072== by 0x4006067: _dl_map_object_from_fd (dl-load.c:957)
==14072== by 0x4007EBC: _dl_map_object (dl-load.c:2250)
==14072== by 0x40124EF: dl_open_worker (dl-open.c:226)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
Я создаю свои темы с помощью:
rc = pthread_create(&threads[t], NULL, thread_stall, (void *)NULL);
(rc = код возврата).В конце точки входа я вызываю pthread_exit ().