C 检查线程状态,同时使其处于可等待状态

C 检查线程状态,同时使其处于可等待状态,c,multithreading,status,wait,C,Multithreading,Status,Wait,我想知道是否有可能检查线程的状态,它可能处于可等待状态,但不一定要处于可等待状态,如果它处于可等待状态,我希望它保持在该状态 基本上,我如何在不改变线程(waitable)状态的情况下检查线程的状态 所谓waitable,我的意思是,如果我调用wait(pid),它将正确返回,而不会挂起 我还要补充一点,我正在跟踪一个多线程程序,因此我不能更改它的代码。另外,我也省略了这些信息,但这是一个基于Linux的系统。您是在询问进程还是线程?wait函数作用于进程,而不是线程,因此您所写的问题无效 对于

我想知道是否有可能检查线程的状态,它可能处于可等待状态,但不一定要处于可等待状态,如果它处于可等待状态,我希望它保持在该状态

基本上,我如何在不改变线程(waitable)状态的情况下检查线程的状态

所谓waitable,我的意思是,如果我调用wait(pid),它将正确返回,而不会挂起


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

您是在询问进程还是线程?
wait
函数作用于进程,而不是线程,因此您所写的问题无效

对于(子)进程,您可以通过使用
WNOWAIT
标志调用
waitid
来检查状态。这将使进程处于等待状态


对于线程,在某些实现上,您可以调用
pthread\u kill(thread,0)
并检查
ESRCH
以确定线程是否已退出,同时将
线程保持在可接合状态。请注意,只有当线程是可连接的时,才有效。如果它已分离或已连接,则您正在调用未定义的行为,并且您的程序应该崩溃或更糟。不幸的是,在这种情况下,没有要求
pthread\u kill
报告
ESRCH
,因此它可能会错误地报告线程仍然存在,而实际上它已经终止。当然,从形式上讲,调用
pthread_exit
和实际终止之间一直存在的线程与实际终止的线程之间没有区别,因此这个问题有点毫无意义。换句话说,在
pthread\u join
被阻止等待终止之前,不要求可连接线程终止。

是否要执行类似操作(伪代码)

如果这确实是你想要做的,那么你就是在将自己暴露在种族环境中。例如,如果
my_thread
状态(my_thread)
之后但在
做某事()之前(或者甚至在
==等待之前)醒来,该怎么办

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


顺便说一句,劳伦斯·利弗莫尔国家实验室有一本关于多线程概念的优秀教程(包括条件变量)。此特定文档使用POSIX API,但所解释的概念是通用的。

我正在跟踪多线程程序,因此我认为我无法应用这些概念,因为我无法更改代码。我现在已经在使用waitpid来等待线程,因此我不得不不同意。您应该查看Linux Notes下部分的waitpid手册页。不管怎样,我不仅仅是想弄清楚它是在运行还是终止,我还想知道它是否停止了,如果是,是什么信号造成的,那么你只是在编写严重破坏的、不可移植的代码。此外,线程不能因信号而终止或停止。只有进程可以因信号而终止或停止。对于线程,应该使用pthread同步原语来确定其状态。一种简单的方法是让线程在终止时发布一个信号量。然后您可以使用
sem\u trywait
查询线程是否已终止。如果您再次阅读我的问题,您将看到我说我正在跟踪多线程进程,因此我无法更改代码的功能,我只是在跟踪它并试图确定它在特定时间点的状态。其次,此代码仅用于特定的体系结构,因此我不关心它是否可移植。最后,线程在linux中只是一种特殊类型的进程,因此我再次不同意你所说的不能用信号停止线程的说法,因为我目前已经这样做了。信号将传递到整个进程并停止整个进程。您应该使用
ptrace
来跟踪…这并不能回答我的问题,我知道如何跟踪进程,但我希望按照问题中的描述检索线程的状态。你知道怎么做吗?如果你所拥有的只是关于你认为我在我的程序中做错了什么的建议,请不要费心回复。
if (status(my_thread) == waiting)
    do_something();
else
    do_something_else();