检查线程状态,同时保持其处于等待状态

时间:2011-07-30 00:32:23

标签: c multithreading status wait

我想知道是否可以检查一个线程的状态,该线程可能处于一个等待状态但不一定是,如果它处于一个等待状态,我想让它处于该状态。

基本上,如何在不改变其(可等待)状态的情况下检查线程的状态。

通过waitable,我的意思是如果我调用wait(pid)它会正常返回而不会挂起。

我还要补充一点,我正在跟踪一个多线程程序,因此我无法更改它的代码。另外,我也省略了这些信息,但这是一个基于Linux的系统。

2 个答案:

答案 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_threadstatus(my_thread)之后但do_something()之前(或甚至在== waiting之前醒来)会怎样?

您可能需要考虑条件变量,以便在线程之间安全地传递“状态”。线程安全队列也可能是一个选项...

顺便说一句,劳伦斯利弗莫尔国家实验室在https://computing.llnl.gov/tutorials/pthreads/(包括条件变量)上有一个关于多线程概念的优秀教程。此特定文档使用POSIX API,但解释的概念是通用的。