2012-02-15 45 views
0

所以,我正在实现一个带有多线程(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()。

+0

是的,您可以通过正确编程来避免内存泄漏。并非所有库在这方面都很完美,您可能会忽略来自外部库的错误。另外,“仍然可以”不是真正的“泄漏”,而是“懒惰”。 (这解释了为什么它在外部库中。)泄漏是“绝对丢失”的。 – 2012-02-15 06:08:02

+0

感谢您的评论。事实证明,很多“仍然可以访问”的内存是因为在重新启动它们之前我没有加入我的线程。 – Risshuu 2012-02-16 01:52:47

回答

0

这是我的看法:

1.如果你希望你的线程正常退出(开放文件杀死它们,或者套接字句柄是不是一个好主意),让他们在循环终止标志:

while(!stop) 
{ 
    do work 
} 

然后,当你赶上ctrl-c将标志设置为true,然后加入它们。确保声明停止为std::atomic<bool>以确保所有线程都能看到更新的值。这样他们将完成当前的一批工作,然后在下次检查条件时优雅地退出。

2.我没有足够的关于您的代码的信息来回答这个问题。