Многопоточность и атомарность / утечки памяти - PullRequest
0 голосов
/ 15 февраля 2012

Итак, я реализую программу с несколькими потоками (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 ().

1 Ответ

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

Вот мой дубль:

1.Если вы хотите, чтобы ваши потоки выходили корректно (убивать их открытыми файлами или дескрипторами сокетов никогда не бывает хорошей идеей), сделайте так, чтобы они зацикливались на флаге завершения:

while(!stop) 
{
    do work
}

Затем, когда вы ловите Ctrl-C, установите флаг true, а затем присоединитесь к ним. Обязательно объявите stop как std::atomic<bool>, чтобы все потоки увидели обновленное значение. Таким образом, они завершат текущий пакет работ и затем корректно выйдут при проверке условия в следующий раз.

2.У меня недостаточно информации о вашем коде, чтобы ответить на этот вопрос.

...