【问题标题】:If the thread calling `pthread_join ()` is canceled, then the target thread will remain joinable如果调用 `pthread_join()` 的线程被取消,那么目标线程将保持可连接状态
【发布时间】:2012-05-23 06:36:41
【问题描述】:

发件人:http://linux.die.net/man/3/pthread_join

如果调用 pthread_join() 的线程被取消,那么目标线程将保持可连接状态(即不会分离)。

这是否意味着如果我们取消调用pthread_join的主线程,目标线程不会被中止?

【问题讨论】:

    标签: multithreading pthreads


    【解决方案1】:

    pthread_join() 首先不会“中止”目标线程,所以我不确定我是否完全理解这个问题。

    基本上,如果一个线程(主线程或其他线程)调用pthread_join(),它会要求阻塞,直到目标线程退出。在正常情况下,一旦目标线程退出,调用pthread_join()的线程将解除阻塞,与目标线程关联的任何资源都可以被系统释放。

    然而,如果一个线程调用了pthread_join()(并且被阻塞等待目标线程退出)并且被阻塞的线程被取消,那么pthread_join()调用的目标基本上不会发生任何事情(它继续) .文档要澄清的是,该线程仍然是“可连接的”——这意味着:

    • 另一个线程可以调用pthread_join() 等待它完成
    • 当线程完成并加入时系统可以释放的资源将不会释放,除非另一个线程加入目标线程或为目标线程调用pthread_detach()。为线程调用 pthread_detach() 使其“不可加入” - 它继续运行并且它的资源将在它退出时被释放(分离调用向系统表明在线程退出后不会使用这些资源),但没有线程可以加入不用了。

    【讨论】:

    • "pthread_join() 并没有“中止”一个目标线程,“我没有说它会。如果我们不写 pthread_join,如果父线程写了,子线程将被中止。所以,我问如果我们取消调用pthread_join的父线程,子线程会被中止吗?
    • "线程完成后系统可以释放的资源" 会是什么资源?喜欢 - 内存位置分配?
    • @Anisha:为了清楚起见(对于其他读者或任何人),线程之间没有子/父关系。如果线程A创建线程B然后线程A退出(或被取消),对线程B没有影响。当然,如果进程退出,那就是另一回事了。
    • @Anisha:我不确定,但是当线程退出(并且不再可连接)时可能释放的东西可能包括:线程的堆栈,内存位置其中pthread_exit() 中的线程“返回”的值是保持连接的,并且必须有某种同步对象(类似于条件变量),当线程调用pthread_join() 以等待要退出的目标线程。
    【解决方案2】:

    文学的意思是如果你有3个线程A,B,CB加入A,那么C可以加入A如果B已取消。

    取消加入线程不一定中止加入的线程。当一个线程被取消时,它可以在终止前进行清理,这包括取消其他线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多