跟踪pthread

时间:2011-12-19 15:47:19

标签: c++ c pthreads posix

我提出了很多线程运行。稍后,我想检查这些线程是否仍然存在(即尚未完成但未意外终止)。

  1. 我应该首先跟踪有关线程的哪些信息。线程ID,进程ID等?我该如何获得这些ID?

  2. 当我需要检查这些线程的活跃度时,我应该使用哪些函数? pthread_kill会在这里工作吗? pthread_kill采用不透明类型pthread_t作为参数,我认为该参数通常为unsigned longpthread_t与线程ID不同吗?我假设一个线程ID将获取一个int作为其值。在pthread的一些教程中,他们将一个整数分配给pthread作为其ID。线程不应该从操作系统获取其ID吗?

2 个答案:

答案 0 :(得分:3)

  1. 线程的整个身份位于pthread_t

  2. 初始化线程会将其pthread_t类型的ID返回给其父级

  3. 每个帖子都可以使用pthread_self()

  4. 获取自己的ID
  5. 您可以使用以下函数比较线程ID:int pthread_equal (pthread_t, pthread_t)

  6. 因此:维护一个公共数据结构,您可以使用pthread_t ID和pthread_equal比较函数将线程状态存储为STARTED,RUNNING,FINISHED,以区分线程。父项在启动线程时将值设置为STARTED,线程本身将自己的状态设置为RUNNING,执行其工作,并在完成时将自身设置为FINISHED。使用互斥锁确保在读取时不会更改值。

    编辑: 您可以使用pthread_cleanup_push设置一种“线程析构函数”: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cleanup_pop.html

    即。注册线程退出时要调用的例程(自身或外部取消)。此例程可以更新状态。

答案 1 :(得分:2)

  1. 当您调用pthread_create时,第一个参数是指向pthread_t的指针,pthread_create将为其分配新创建的线程的线程ID。如果要获取当前线程的线程ID,请使用pthread_self()。这是线程所需的唯一标识信息,因为以这种方式创建的所有线程共享相同的进程ID。

  2. 检查线程是否存活的方式取决于您需要此信息的内容。如果您只想等到线程完成,则使用线程ID作为第一个参数调用pthread_join,并将指向线程函数返回值的位置的指针作为第二个参数。除非您通过在线程中调用pthread_detach(pthread_self())来分离您创建的线程,否则最终需要在它们上调用pthread_join,以便它们不会继续保持其堆栈空间。

    如果由于某种原因你想在线程运行时做某事,你可以为该线程终止时每个线程创建一个全局变量,并用主线程检查该变量。在这种情况下,您可能希望分离线程,以便以后也不必加入它们。