【问题标题】:Threads exiting before joining加入前退出的线程
【发布时间】:2016-12-30 11:22:55
【问题描述】:

请原谅我刚刚开始了解多线程的概念,我只是想知道为什么我的线程可能在它们加入之前就退出了。本质上,我正在维护一个进程 ID 的全局列表,我通过调用

迭代地创建它们
   if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) {
        fprintf(stderr, "error thread not created\n"); 
    }

现在的问题是,我的所有线程在进入我的 pthread 连接之前都已退出

pthread_join(thread_id[i], NULL);

深深嵌套在函数调用中,在线程创建后直接调用。我不确定我是否应该做一些锁定或其他事情,或者添加一个额外的命令来确保线程等到 join 语句才退出。

【问题讨论】:

  • 这取决于function_to_execute。也许它会引发异常?你怎么知道他们在到达join 之前就退出了?也许他们处于无限循环或其他什么
  • 如果你pthread_join()ing 的线程已经终止,没有问题。在这种情况下,pthread_join() 将立即返回,否则必须等待。 但是:您不得尝试使用已被pthread_join()ed 或pthread_detach()ed 的线程pthread_join()。
  • 非常好的线程教程:computing.llnl.gov/tutorials/pthreads
  • 感谢您提供所有这些信息。 @AhmadWabbi 我认为您对我的问题可能是对的,我已经运行了一些测试并将函数限制为仅打印“已执行”,并在 for 循环之前创建线程,并在每次迭代后加入 thread_id[i]。输出如下: 执行 执行 执行 循环.. 循环.. 循环.. 循环.. 执行
  • @noobatrilla,是的,你的描述不正确。新线程一被创建就开始运行(或至少有资格运行)。 pthread_join()的目的是等到指定线程结束,之后进行清理。

标签: c multithreading thread-safety pthreads thread-synchronization


【解决方案1】:

来自POSIX 文档:

pthread_join() 函数应暂停调用的执行 线程直到目标线程终止,除非目标线程 已经终止。从成功的 pthread_join() 返回时 使用非 NULL value_ptr 参数调用,传递给的值 终止线程的 pthread_exit() 应在 value_ptr 引用的位置。当 pthread_join() 返回时 成功,目标线程已终止。结果 多个同时调用 pthread_join() 指定相同 目标线程未定义。如果调用 pthread_join() 的线程是 取消,则不应分离目标线程。

所以,不。只要满足上述要求,就不需要采取任何额外措施。

【讨论】:

    【解决方案2】:

    我不完全确定如果线程在 pthread_join() 声明其退出状态之前完成,为什么会出现问题?

    这是完全正常的。

    pthread_create() 在指定函数处启动新的执行线程。该函数立即运行,甚至可能抢占启动线程。线程有自己的局部变量(堆栈)和线程局部变量。必须协调所有其他共享内存访问,否则将发生数据竞争。通常共享数据受到互斥锁的保护。线程将继续运行(通常与其他线程并行),直到它被某些同步操作阻塞或线程退出其启动函数。

    线程可以使用 pthread_join() 等待其他线程成功完成执行。就像usr 指出的那样,如果线程已经完成,pthread_join() 将不会等待。

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2021-04-06
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多