【发布时间】:2012-03-06 11:34:32
【问题描述】:
所以,我正在实现一个具有多个线程 (pthread) 的程序,我正在寻求一些方面的帮助。我在linux上做c++。到目前为止,我的所有其他问题都已由 Google 回答,但仍有两个问题我没有找到答案。
问题 1:我将在我的线程中做一些文件 I/O 和网页获取/处理。反正有没有保证线程做什么是原子的?我将让我的程序运行很长一段时间,很有可能,它实际上并没有预先确定的终点。我将捕捉来自 ctrl+c 的信号,之后我想进行一些清理,但仍然希望我的程序打印出结果/关闭文件等。
我只是想知道程序等待线程完成是否是合理的行为,或者我是否应该杀死所有线程/关闭文件并退出。我只是不希望我的结果有偏差。我应该/我可以在信号捕获方法中执行一个 pthread_exit() 吗?
关于这方面的任何其他 cmets/想法都会很好。
问题 2:Valgrind 说我有一些可能的内存泄漏。这些是可以避免的,还是在 c++ 中的线程中总是会发生这种情况?以下是我在使用 valgrind 时收到的六条左右消息中的两条。
我一直在查看许多不同的网站,其中一个说一些可能的内存泄漏可能是因为休眠线程。这对我来说没有意义,不过,我目前正在休眠线程以测试我现在的设置(我现在实际上并没有做任何真正的 I/O,只是在玩线程)。
==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()。
【问题讨论】:
-
是的,您可以通过正确编程来避免内存泄漏。并非所有库在这方面都是完美的,您可能希望忽略来自外部库内部的错误。此外,“仍然可达”并不是真正的“泄漏”,而是“懒惰”。 (这解释了为什么它在外部库中。)泄漏是“绝对丢失”。
-
感谢您的评论。事实证明,很多“仍然可以访问”的内存是因为我在重新启动线程之前没有加入线程。
标签: c++ multithreading memory-leaks valgrind