我想知道是否可以检查一个线程的状态,该线程可能处于一个等待状态但不一定是,如果它处于一个等待状态,我想让它处于该状态。
基本上,如何在不改变其(可等待)状态的情况下检查线程的状态。
通过waitable,我的意思是如果我调用wait(pid)它会正常返回而不会挂起。
我还要补充一点,我正在跟踪一个多线程程序,因此我无法更改它的代码。另外,我也省略了这些信息,但这是一个基于Linux的系统。
答案 0 :(得分:2)
您是在询问进程还是线程? <{1}}函数作用于进程,而不是线程,因此你写的问题无效。
对于(子)进程,您可以通过使用wait
标志调用waitid
来检查状态。这将使该过程处于等待状态。
对于线程,在某些实现中,您可以调用WNOWAIT
并检查pthread_kill(thread, 0)
以确定线程是否已退出,同时使ESRCH
处于可连接状态。请注意,仅当线程可加入时才有效 。如果它已分离或已加入,则表示您正在调用未定义的行为,您的程序应该崩溃或更糟。遗憾的是,在这种情况下,thread
无需报告pthread_kill
,因此可能会错误地报告线程仍然存在,而实际上它已经终止。当然,正如在ESRCH
的调用和实际终止之间永远存在的线程之间存在没有区别,以及实际上已经完成终止的线程,所以问题有点无意义的。换句话说,在pthread_exit
被阻止等待它终止之前,不要求可连接的线程终止。
答案 1 :(得分:0)
你想做这样的事情(伪代码)吗?
if (status(my_thread) == waiting)
do_something();
else
do_something_else();
如果这确实是你想要做的事情,那么你就是在暴露自己的竞争条件。例如,如果my_thread
在status(my_thread)
之后但do_something()
之前(或甚至在== waiting
之前醒来)会怎样?
您可能需要考虑条件变量,以便在线程之间安全地传递“状态”。线程安全队列也可能是一个选项...
顺便说一句,劳伦斯利弗莫尔国家实验室在https://computing.llnl.gov/tutorials/pthreads/(包括条件变量)上有一个关于多线程概念的优秀教程。此特定文档使用POSIX API,但解释的概念是通用的。