【问题标题】:Use of pthread_join()使用 pthread_join()
【发布时间】:2014-04-11 15:57:07
【问题描述】:

我想知道,如果我们在没有 pthread_join 的情况下执行 pthread_create 会发生什么?

谁将“清理”“未加入”线程的所有内存。

【问题讨论】:

标签: c linux multithreading pthreads posix


【解决方案1】:

当进程终止时,与该进程关联的所有资源都将不复存在。 (这当然不包括进程创建的共享资源,如文件系统中的文件、共享内存段等。)在此之前,未加入的线程将继续消耗资源,可能会调用未来对@的调用987654321@ 甚至 malloc 失败。

【讨论】:

  • 为什么这些调用会因为线程尚未终止而失败?
  • 因为这些东西占用资源。例如,一个线程需要几兆字节的地址空间来进行堆栈映射,当地址空间用完时,就无法启动新线程。
  • 在应用程序启动时创建线程并且从不终止它们是很常见的,例如。应用程序生命周期线程和池线程。这种使用不一定需要 join(),也不会持续消耗任何额外的资源。
  • @MartinJames:这同样适用于内存等其他资源。只要持有的资源数量是有限的且不引人注目,在整个进程生命周期内持有资源并没有什么根本性的危害。
【解决方案2】:

好吧,假设它是一个不需要或尝试显式终止的应用程序生命周期线程,操作系统将在其进程终止时执行此操作(在所有非平凡操作系统上)。

【讨论】:

    【解决方案3】:

    如果线程是在没有使用 pthread_join 的情况下创建的,那么当主线程完成执行时,在主函数中创建的所有其他线程都将停止,因此不会完成执行其中的整个语句。

    查看Pthread_join的文档。

    它会使主线程挂起,直到派生线程完成执行。

    【讨论】:

    • 正确;更准确地说,在主线程返回的启动代码中对_exit() 的调用将终止整个进程。因此,如果有人在主线程返回之前将其停止,其他线程将继续运行,而其他人需要终止该进程。
    • 它将阻塞调用线程,直到目标线程终止。不必是调用join()的主线程,也不必是main()直接创建的目标线程。
    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2019-08-12
    • 2012-01-20
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多