【问题标题】:How to check any thread is working currently如何检查任何线程当前正在工作
【发布时间】:2010-06-19 19:34:04
【问题描述】:

我知道有一个用于多进程

 waitpid(-1,WNOHANG,NULL)

这是一个非阻塞函数调用,用于检查当前是否有任何子进程在工作

但是有没有类似的 lib 函数来检查多线程?

我要做的就是检查当前是否有任何线程,如果没有重置一些全局值。

【问题讨论】:

    标签: c multithreading waitpid


    【解决方案1】:

    这是一个非阻塞函数调用,用于检查当前是否有任何子进程在工作

    错了。这是一个检查是否有任何子进程尚未终止的调用。它不仅会检查而且还会收获一个终止的孩子(如果有的话)。孩子们可能处于其他任何可能的状态,例如陷入僵局(我的书上的内容远非工作)。

    我要做的就是检查当前是否有任何线程,如果没有重置一些全局值。

    也许你应该在这里发布一个问题,你为什么要这样做。听起来你做错了什么。

    如果您还没有为您的线程执行 pthread_join(),这意味着您的线程已经执行了 pthread_detach()。如果您在添加线程时没有问题 pthread_detach() 我认为向线程添加一些额外的代码以识别它们(几乎)终止(例如 sem_post())是没有问题的,以便 main() 可以注意到线程已终止(例如通过调用 sem_trylock())。

    如果不要求可移植性,也可以尝试定期查询进程的操作系统线程数。

    虽然在程序中拥有一些线程,具有未定义的生命周期,与主线程没有任何适当的同步,这仍然是 IMO 错误。

    【讨论】:

      【解决方案2】:

      你可以只保存一个线程的句柄并有一个函数来检查它是否仍在运行。我不确定是否有功能,但这应该可以。

      【讨论】:

        【解决方案3】:

        pthread_kill(pid, 0) 其中 pid 是 pthread_create 返回的线程 id 可以告诉您线程是否还活着。 (这就是我理解你的问题的方式) 如果线程还活着,则返回 0,否则返回错误代码。

        【讨论】:

        • 我想你误解了我的问题。我想为任何线程使用像 waitpid(-1,WNOHANG,NULL) 这样的函数,而不是特定线程
        • 对不起。 pthread_join 的页面声明了一些东西,好像他们无法找到一个关于等待所有创建线程的函数的折衷方案,并建议程序员应该自己实现这个:-(waitpid 的 linux 手册页提到了标志可用于处理使用“克隆”创建的子进程和线程。但这可能无法移植到其他系统。
        【解决方案4】:

        我问自己一个非常相似的问题:

        POSIX API call to list all the pthreads running in a process

        在你的情况下,我会结束 ps -eLF

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-09
          • 2017-01-11
          • 2014-01-24
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-21
          相关资源
          最近更新 更多