【问题标题】:What Happens If I Detach A Thread That Has Been Joined?如果我分离已加入的线程会发生什么?
【发布时间】:2014-03-06 01:08:19
【问题描述】:

问题是不言自明的,但这里是上下文,基本上我有一个服务器套接字线程,当它接收到新连接时会产生子线程。这些子线程接受来自远程连接的数据转储,然后自行清理并在完成后关闭。

目前我有子线程在它们退出之前调用“pthread_detach(pthread_self())”,我正在考虑做的是让程序等待程序关闭,以完成活动数据转储。现在我实际上已经有了另一种解决方法,它是我用来跟踪活动线程的动态数组的一部分,但为了将来参考,我想知道如果你加入一个注定要分离的线程之前会发生什么它会关闭,如果它会导致任何问题。

【问题讨论】:

    标签: c multithreading


    【解决方案1】:

    这就是文档所说的。

    如果实现在其生命周期结束后检测到线程 ID 的使用,建议该函数失败并报告 [ESRCH] 错误。(已为这两个函数列出。)

    如果你加入一个分离的线程,你应该得到一个错误返回。

    如果你分离一个加入的线程,也会发生同样的情况。

    【讨论】:

    • 那么,我认为这是否意味着分离线程会使线程 ID 无效,这会使加入的线程抛出错误?
    • 类似的东西。该函数将尝试查找 id 并失败。
    • 这意味着 pthread_join 的实现将在初始调用后继续检查 id,这是有道理的,因为如果 id 确实变得无效,那么它指向的数据也将无效,导致空指针或类似的东西。所以理论上你仍然可以加入一个你知道要分离的线程,但是你会期待一个 [ESRCH] 错误而不是一个返回值,谢谢。
    • @Skid 我宁愿使用容器和一些标志。
    • 这就是计划,我有一个动态池(数组),其中包含我将要使用的以下结构。 “typedef struct { pthread_t worker; bool used; } Element;”因此,每个工作人员在关闭时只会将 used 变量设置为 false。我想知道会产生什么影响以供将来参考,所以我知道如果我再次遇到这样的事情会发生什么。
    猜你喜欢
    • 2017-06-12
    • 2017-10-27
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多