【问题标题】:Detach thread right after creation and memory leaks在创建和内存泄漏后立即分离线程
【发布时间】:2025-11-23 10:30:01
【问题描述】:

我正在尝试创建一个分离的线程,因此我不需要释放为其分配的内存。 Valgrind 用于检查内存泄漏。 我用过IBM example 并写道:

void *threadfunc(void *parm)
{
  printf("Inside secondary thread\n");
  return NULL;
}

int main(int argc, char **argv)
{
  pthread_t             thread;
  int                   rc=0;
  rc = pthread_create(&thread, NULL, threadfunc, NULL);
  sleep(1);
  rc = pthread_detach(thread);
  return 0;
}

此方法有效且不会造成泄漏,而是没有“sleep(1);”的版本没有。 为什么需要这个 sleep(1)?

【问题讨论】:

    标签: c multithreading memory-leaks pthreads


    【解决方案1】:

    我正在尝试创建一个分离的线程,所以我不需要释放 为其分配的内存。

    在这种情况下,pthread_detach() 不是必需的,因此不应使用。另外,在这段代码 sn-p 中,您没有进行任何显式内存分配,因此您不必担心释放内存。

    为什么需要这个 sleep(1)?

    当您创建新线程时,父线程和子线程可以以任意顺序开始执行。 它取决于操作系统计划和其他因素。现在在这种情况下,如果父线程得到 首先安排,然后它有可能在子线程之前退出并退出程序 开始执行。

    通过在父上下文中添加睡眠,子线程在完成之前有时间开始和完成执行。但这不是一个好主意,因为我们不知道子线程需要多少时间。因此 pthread_jon() 应该在父上下文中使用。有关详细信息,请参阅以下链接中的 POSIX 线程文档和精彩的文章

    https://computing.llnl.gov/tutorials/pthreads/

    【讨论】:

    • '首先,pthread_detach() 是危险的,不应该使用(几乎)。' - 为什么?
    • @MartinJames:简单的原因是很难找到有关分离线程的痕迹。在阅读 TC++PL 第 4 版时,Bjrane Stroustrup 提到了它为什么不是很好的做法使用线程::分离。我的意图是,在这种情况下,用户提到的情况不需要它。我已经修改了我对此的陈述。