【问题标题】:Possible states for native threads on Android?Android上本机线程的可能状态?
【发布时间】:2011-12-03 06:59:06
【问题描述】:

在 Android 设备上执行本机 (C/C++) 线程期间所有可能的线程状态是什么?它们与Java Thread States 相同吗?它们是 Linux 线程吗? POSIX 线程?

不是必需的,但提供可导致线程进入每个状态的示例的奖励积分。

编辑:根据要求,动机如下:

我正在为一个采样分析器设计接口,该分析器可在 Android 上使用本机 C/C++ 代码。探查器报告将随着时间的推移显示线程状态。我需要知道所有状态是什么,以便 a) 知道我需要多少不同的状态才能在视觉上区分,b) 设计一个配色方案,在视觉上区分和分组理想状态与不理想状态。

【问题讨论】:

  • 如果您没有得到正确答案,请尝试更改您的问题。为什么你需要知道所有的状态,你打算用原生线程做什么?
  • @mice 我已经编辑了我的问题以包含对您的问题的答案,但我认为它们不会影响我将(或不会)得到的各种答案。 :)

标签: android c++ c linux multithreading


【解决方案1】:

谷歌:

Thread.State  BLOCKED       The thread is blocked and waiting for a lock. 
Thread.State  NEW           The thread has been created, but has never been started. 
Thread.State  RUNNABLE      The thread may be run. 
Thread.State  TERMINATED    The thread has been terminated. 
Thread.State  TIMED_WAITING The thread is waiting for a specified amount of time. 
Thread.State  WAITING       The thread is waiting. 

这些状态没有得到很好的解释 - 例如,我看不出 BLOCKED 和 WAITING 之间的区别。

有趣的是,没有“RUNNING”状态 - 这些设备会执行任何操作吗?

【讨论】:

  • 能否提供您找到这些结果的 URL?这些看起来与我在问题中提供的Java threads 链接相同。
  • 在没有引用的情况下投反对票,并且由于看起来只是“Android 线程状态”在 Google 上的第一个热门。
  • 来吧,马丁。这家伙显然在谷歌上搜索过。
【解决方案2】:

有人告诉我,Android 上的本机线程只是轻量级进程。这与我对 Linux 的总体发现一致。引用this wiki page:

Linux 机器上的进程(包括线程)可以处于以下任何一种状态:

  • TASK_RUNNING - 进程正在 CPU 上执行或等待执行。
  • TASK_INTERRUPTIBLE - 进程暂停(休眠),直到某些条件变为真。引发硬件中断、释放进程正在等待的系统资源或传递信号是可能唤醒进程的条件示例(将其状态恢复为 TASK_RUNNING)。通常阻塞 IO 调用(磁盘/网络)会导致任务被标记为 TASK_INTERRUPTIBLE。一旦它等待的数据准备好被读取,设备就会引发中断,并且中断处理程序将任务的状态更改为 TASK_INTERRUPTIBLE。处于空闲模式(即不执行任何任务)的进程也应该处于这种状态。
  • TASK_UNINTERRUPTIBLE - 与TASK_INTERRUPTIBLE 类似,不同之处在于向睡眠进程传递信号使其状态保持不变。这种进程状态很少使用。然而,在某些特定条件下,它是有价值的,在这些特定条件下,进程必须等待给定事件发生而不被中断。理想情况下,不会有太多任务处于这种状态。
    • 例如,当进程打开设备文件并且相应的设备驱动程序开始探测相应的硬件设备时,可以使用此状态。在探测完成之前不得中断设备驱动程序,否则硬件设备可能会处于不可预知的状态。
    • 原子写入操作可能需要将任务标记为UNINTERRUPTIBLE
    • NFS 访问有时会导致访问进程被标记为UNINTERRUPTIBLE 因此,可以在几分之一秒内标记从磁盘读取/写入磁盘的操作
    • 页面错误后的 I/O 标记进程 UNINTERRUPTIBLE
    • 因页面错误而访问的同一磁盘的 I/O 可能导致进程标记为 UNINTERRUPTIBLE
    • 程序员可以将任务标记为UNINTERRUPTIBLE,而不是使用INTERRUPTIBLE
  • TASK_STOPPED - 进程执行已停止;进程收到SIGSTOPSIGTSTPSIGTTINSIGTTOU信号后进入该状态。
  • TASK_TRACED - 进程执行已被调试器停止。
  • EXIT_ZOMBIE - 进程执行终止,但父进程尚未发出wait4()waitpid() 系统调用。在父进程发出类似wait() 的调用之前,操作系统不会清除僵尸进程。
  • EXIT_DEAD - 最终状态:该进程正在被系统删除,因为父进程刚刚对其发出了wait4()waitpid() 系统调用。将其状态从 EXIT_ZOMBIE 更改为 EXIT_DEAD 可避免由于其他执行线程在同一进程上执行类似 wait() 的调用而导致的竞争条件。

编辑:然而Dalvik VM Debug Monitor 提供了不同的状态。从其文档中:

“线程状态”必须是以下之一:

1 - running(正在执行或准备执行)
2 - sleeping(在 Thread.sleep() 中)
3 - monitor(被监视器锁定)
4 - waiting(在 Object.wait() 中)
5 - initializing
6 - starting
7 - native(执行本机代码)
8 - vmwait(等待 VM 资源)

"suspended" [数据结构中的一个单独标志]如果线程正在运行,则为 0,否则为 1。

【讨论】:

  • 更明确地说,Dalvik 线程直接建立在 Linux 线程上,并从 Linux 的工作方式继承它们的所有状态。这个问题的答案如下所示,这正是 Linux 所做的。没有什么特别值得关注的与 Android 相关的内容。
  • @hackbod 太好了,谢谢!如果你能在接下来的 14 小时内提供一个引用官方外观的答案来支持这一点,我很乐意为你提供赏金。
【解决方案3】:

如果您设计的系统应用程序必须以比普通应用程序更高级的方式使用线程,我首先会检查 Android 上可以使用哪些 API 来访问线程。

答案是 pthread = POSIX 线程,带有 pthread.h 头文件,在 Bionic C 库中实现。因此,您可以了解自己可以实现的目标。

另一件事是Android 没有实现完整的pthread 接口,只有Android 运行所需的子集。 更多关于线程 + 仿生here,以及它们如何与 Java 和 VM 交互的描述在here。另外我觉得线程实际上是一个进程,因为我的代码使用 setpriority(PRIO_PROCESS, gettid(), pr);设置新线程的优先级 - 我不记得我是从哪里得到这些信息的,但这很有效。

我假设线程可能处于运行、完成或阻塞(例如等待互斥锁)状态,但这是我的知识有限,因为我从不需要其他线程状态。

现在的问题是,您的应用是否真的可以使用 NDK 中的可用 API 检索这些状态,以及如果有更多状态,您的用户是否真的有兴趣知道。

无论如何,您可以从显示可能不完整的线程状态开始,如果您的用户真的关心,您会从用户的反馈和请求中了解其他状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2013-01-11
    相关资源
    最近更新 更多