代码之家  ›  专栏  ›  技术社区  ›  peterchen

回收安全的线程ID和线程堆栈何时被释放?

  •  2
  • peterchen  · 技术社区  · 15 年前

    为线程保留/提交的堆栈在

    • 线程终止

    • (即线程终止,线程的所有句柄关闭)

    更广泛地说,是否存在与已终止的线程相关联的重要资源,但由于存在有效的句柄而仍然存在?


    原因:我需要修改一种“作用域单例”,这样它就不会返回单个对象,而是每个线程返回一个对象。我不能依赖线程创建/终止通知,更不能依赖进程范围的通知。

    目前,我将这些对象存储在 map<ThreadID, Object> ,具有适合我的应用程序的缓存清理策略。为了保护自己不受操作系统“回收”线程ID的影响,我打开了一个线程句柄(记录

    另一个副作用是在某些情况下将打开的句柄保持在长终止线程上。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Lior Kogan    15 年前

    "Windows VIA C/C++" 由李希特和Nasarre(一本必备的书,用于任何C++ WWWOS程序员)P.154:

    终止线程

    一个线程可以在四个线程中终止

    • 线程函数返回(强烈建议这样做。)
    • 方法。)
    • 同一进程或另一进程中的线程调用TerminateThread 功能(避免使用此方法。)
    • 包含线程的进程终止(避免使用此方法。)

    线程函数返回

    你应该经常设计你的线 希望线程终止。这是 唯一能保证 适当地。

    让线程函数返回 确保以下各项:

    • 在线程函数中创建的所有C++对象都将被销毁 通过他们的毁灭者。
    • 堆叠。
    • 系统将设置线程的退出代码(在线程的 函数的返回值。
    • 系统将减少线程内核对象的使用计数。

    ExitThread函数

    您可以通过调用ExitThread来强制线程终止:

    VOID ExitThread(DWORD dwExitCode);

    此函数用于终止线程 清理所有操作系统 由 线程。但是,你的C/C++资源 被摧毁。因为这个原因,它是 最好是从你家回来 退出线程。

    当然,您可以使用ExitThread的 dwExitCode参数告诉 代码到。ExitThread函数没有 不返回值,因为线程 已终止,无法执行任何 更多代码。

    线程终止是通过 如前一节所述)。 如本节所述,请注意 ExitThread函数是 如果你正在编写C/C++代码,你 不应该调用ExitThread。相反, 你应该使用C++运行时 库函数\u endthreadex。如果你 不要使用微软的C++编译器, 这个选择是,你必须使用它。

    TerminateThread函数

    打电话给 TerminateThread还会终止线程:

    hThread、DWORD和dwExitCode);

    与ExitThread不同,ExitThread总是杀死 调用线程TerminateThread 可以杀死任何线程。线程 要终止的线程。当 成为作为 dwExitCode参数。此外,还有 线程的内核对象有其用法

    注意TerminateThread函数是 希望线程运行的系统 终止,但线程未终止 函数返回。如果你需要的话 一定要知道这根线 你可能想打电话给我 WaitForSingleObject或类似函数, 通过线的把手。

    设计良好的应用程序从不使用 因为线程 没有收到通知 它快死了。线程不能 防止自己被杀。

    注意当一根线死的时候 或者调用ExitThread,即 线程被破坏。但是,如果 不会破坏线程的堆栈 直到拥有 线程终止。微软故意 是的。如果其他线程仍在执行 是指 其他线程将提升访问权限 违规行为。离开被杀的人 线程可以继续执行 好的。

    此外,动态链接库 (DLL)通常接收通知 线程被强制终止 未收到此通知 会妨碍正确的清理。

    所拥有的所有用户对象句柄 对象由进程拥有 物体。但是,一个线程拥有两个线程 用户对象:窗口和挂钩。什么时候? 一根线死了,系统 自动销毁所有窗口和 只有当 拥有进程终止。

    线程的退出代码从 对传递给的代码仍处于活动状态 退出线程或终止线程。

    线程内核对象的状态 发出信号。

    如果线程是最后一个活动的 进程中的线程,系统 好。

    减1。

    当线程终止时,它的 关联线程内核对象 不会自动释放

    这里面没有什么别的线索 系统可以用线程的 把手。但是,其他线程 可以调用GetExitCodeThread进行检查 hThread已终止,如果已终止, 确定其退出代码:

    BOOL GetExitCodeThread(句柄 hThread、PDWORD和pdwExitCode);

    退出代码值在 pdwExitCode指向的DWORD。如果 线程尚未终止 函数用 静止标识符(定义为 0x103)。如果功能成功, 返回TRUE。

        2
  •  0
  •   doccarcass    13 年前

    pthread_getspecific , pthread_setspecific pthread_key_create