Android上本机线程的可能状态
Possible states for native threads on Android?
在Android设备上执行本地(C/c++)线程时,所有可能的线程状态是什么?它们与Java线程状态相同吗?它们是Linux线程吗?POSIX线程?
不是必需的,但是提供了可能导致线程进入每种状态的示例会给您加分。
编辑:按要求,这是动机:
我正在设计一个采样分析器的接口,在Android上使用本地C/c++代码。分析器报告将显示线程随时间的状态。我需要知道所有的状态是什么,以便a)知道我需要在视觉上区分多少种不同的状态,b)设计一种配色方案,在视觉上区分和分组理想状态和不理想状态。
我被告知Android上的本地线程只是轻量级进程。这与我对Linux的总体发现一致。引用本wiki页面:
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
-进程已停止执行;进程在接收到SIGSTOP
、SIGTSTP
、SIGTTIN
或SIGTTOU
信号后进入该状态。TASK_TRACED
-进程执行已被调试器停止EXIT_ZOMBIE
-进程执行终止,但父进程尚未发出wait4()
或waitpid()
系统调用。操作系统不会清除僵尸进程,直到父进程发出类似wait()
的调用。EXIT_DEAD
-最终状态:由于父进程刚刚发出wait4()
或waitpid()
系统调用,该进程正在被系统删除。将其状态从EXIT_ZOMBIE
更改为EXIT_DEAD
可以避免由于其他执行线程在同一进程上执行wait()
类调用而导致的竞争条件。
Edit:然而Dalvik VM Debug Monitor提供了不同的状态。从它的文档:
"线程state"必须是:
1 -
running
(正在执行或准备执行)
2 -sleeping
(thread . sleep ())
3 -monitor
(被监视器锁阻塞)
4 -waiting
(in Object.wait())
5 -initializing
6 -starting
7 -native
(执行本机代码)
8 -vmwait
(等待虚拟机资源)"suspended"[数据结构中的单独标志]如果线程正在运行,则为0,否则为1。
如果你设计一个系统应用程序,它必须以比普通应用程序更高级的方式与线程一起工作,我首先会检查Android上有哪些可用的API来访问线程。
答案是pthread = POSIX线程,带有pthread.h头文件,在Bionic C库中实现。这样你就有了一个起点,知道你能达到什么目标。
另一件事是Android没有实现完整的pthread接口,只有Android运行所需的子集。更多关于thread + Bionic的信息请点击这里,以及它们如何与Java和VM交互的描述请点击这里。另外,我觉得线程实际上是一个进程,因为我的代码使用setpriority(PRIO_PROCESS, gettid(), pr);设置新线程的优先级-我不记得我从哪里得到这个信息,但这是有效的。
我假设线程可能处于运行,完成或阻塞(例如等待互斥)状态,但这是我的一点有限的知识,因为我从不需要其他线程状态。
现在的问题是,如果你的应用程序实际上可以检索这些状态使用NDK中可用的API,如果有更多的状态,如果你的用户真的有兴趣知道。
无论如何,您可以从显示线程可能不完整的状态开始,如果您的用户真的关心,您可以从用户的反馈和请求中了解其他状态。
Google:
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"状态-这些设备做过任何事情吗?
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 对于每个线程,random_device是否以不同的状态启动?
- 如何防止另一个线程修改状态标志?
- 将另一个线程置于睡眠状态
- 在状态栏上显示来自不同线程中回调的消息
- 如何在C++中访问与线程关联的机器状态
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 多线程插件体系结构中的共享、单侧可变状态
- 多线程状态机在C/C++中的实现
- 如何避免在协程被阻塞时线程进入阻塞状态
- 在传递到线程后保持引用处于活动状态
- 如何知道线程处于挂起状态
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止
- 线程池卡在等待状态
- C++如何在多线程中获取状态
- 工作线程使主线程MFC的对话框处于非活动状态
- 如何在单独的线程中调用方法并使用返回状态
- c++线程处于活动状态
- 线程状态记录器Visual Studio 2008
- 单独线程中的两个窗口同时处于活动状态