所以,我正在实现一个带有多线程(pthreads)的程序,我正在寻找几点帮助。我在linux上做C++。迄今为止,Google的所有其他问题都得到了Google的回答,但仍有两个问题没有找到答案。多线程和原子性/内存泄漏
问题1:我将在我的线程中做一些文件I/O和网页获取/处理。无论如何要保证线程是原子的吗?我将会让我的程序运行很长一段时间,而不是可能的,并且它不会有预定的终点。我将从ctrl + c捕捉信号,并且我想在之后做一些清理,并且仍然希望我的程序打印出结果/关闭文件等。
我只是想知道它是否合理为程序等待线程完成,或者如果我应该杀死所有线程/关闭文件并退出。我只是不希望我的结果出现偏差。我应该/只能在信号捕获方法中做一个pthread_exit()吗?
任何其他意见/想法在这将是很好的。
问题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()。
是的,您可以通过正确编程来避免内存泄漏。并非所有库在这方面都很完美,您可能会忽略来自外部库的错误。另外,“仍然可以”不是真正的“泄漏”,而是“懒惰”。 (这解释了为什么它在外部库中。)泄漏是“绝对丢失”的。 – 2012-02-15 06:08:02
感谢您的评论。事实证明,很多“仍然可以访问”的内存是因为在重新启动它们之前我没有加入我的线程。 – Risshuu 2012-02-16 01:52:47