我提出了很多线程运行。稍后,我想检查这些线程是否仍然存在(即尚未完成但未意外终止)。
我应该首先跟踪有关线程的哪些信息。线程ID,进程ID等?我该如何获得这些ID?
当我需要检查这些线程的活跃度时,我应该使用哪些函数? pthread_kill
会在这里工作吗? pthread_kill
采用不透明类型pthread_t
作为参数,我认为该参数通常为unsigned long
。 pthread_t
与线程ID不同吗?我假设一个线程ID将获取一个int作为其值。在pthread的一些教程中,他们将一个整数分配给pthread作为其ID。线程不应该从操作系统获取其ID吗?
答案 0 :(得分:3)
线程的整个身份位于pthread_t
初始化线程会将其pthread_t
类型的ID返回给其父级
每个帖子都可以使用pthread_self()
您可以使用以下函数比较线程ID:int pthread_equal (pthread_t, pthread_t)
因此:维护一个公共数据结构,您可以使用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)
当您调用pthread_create
时,第一个参数是指向pthread_t
的指针,pthread_create
将为其分配新创建的线程的线程ID。如果要获取当前线程的线程ID,请使用pthread_self()
。这是线程所需的唯一标识信息,因为以这种方式创建的所有线程共享相同的进程ID。
检查线程是否存活的方式取决于您需要此信息的内容。如果您只想等到线程完成,则使用线程ID作为第一个参数调用pthread_join
,并将指向线程函数返回值的位置的指针作为第二个参数。除非您通过在线程中调用pthread_detach(pthread_self())
来分离您创建的线程,否则最终需要在它们上调用pthread_join
,以便它们不会继续保持其堆栈空间。
如果由于某种原因你想在线程运行时做某事,你可以为该线程终止时每个线程创建一个全局变量,并用主线程检查该变量。在这种情况下,您可能希望分离线程,以便以后也不必加入它们。