【问题标题】:Multi-threading and atomicity/mem leaks多线程和原子性/内存泄漏
【发布时间】: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


【解决方案1】:

这是我的看法:

1.如果您希望线程优雅地退出(用打开的文件或套接字句柄杀死它们绝不是一个好主意),让它们在终止标志上循环:

while(!stop) 
{
    do work
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 2013-12-18
    • 2011-11-05
    • 1970-01-01
    • 2021-05-23
    • 2018-12-18
    • 2021-11-26
    • 2017-02-04
    相关资源
    最近更新 更多