检查分离的线程是否还活着?



我正在使用POSIX线程进行多线程套接字编程项目。我遇到了需要使用setdetachstate()从主程序分离线程的情况;但是,稍后我取消了线程(我知道取消通常是不好的做法,但我知道我在做什么(希望如此((。我需要一种方法来检查线程是否还活着,经过一些研究,我发现即使我有 TID 而不是 PID,waitpid()也可能适合我的目的。但是,在尝试了之后,无论有没有ptraces,它都没有奏效。我在互联网上到处看到的另一种方法是pthread_join().虽然我同意这是最佳方法,但正如我所说,我的线程是分离的,因此无法连接。

作为旁注,我的目标是找到一种方法来等待函数调用pthread_cancel()完成,然后再执行任何后续代码,即

pthread_t tid;
// ...
pthread_cancel(tid);
// wait until pthread with ID tid is cancelled
// more code here...

最初,我需要检查分离的 pthread 是否处于活动状态的原因是因为我打算做这样的事情:while(!pthread_dead(tid));或类似的事情; 但是,如果有一个解决方案直接等待取消完成,那就更好了。请尽量不要批评我使用分离线程或取消线程;我已经考虑了许多行动计划,无论我怎么做,这似乎是必需的(除非我正在做一个多处理的应用程序,我不想这样做(。除非我在做一些在语法或结构上绝对可恶的事情,否则如果你只是回答我的问题,我将不胜感激。

谢谢!

附言我正在用C++编码。

你有没有想过使用Actor模型编程,甚至更好的沟通顺序过程?

当你有一个单独的线程需要关闭并做自己的事情时,这些真的是一个很好的模型,你需要能够告诉它一些事情并获得答案。

您的明显需求是知道异步某些事情已经完成(单独线程的终止( - 让该线程直接向您发送对其终止的确认并没有错,而不是试图通过稍微不稳定的方式确定它是否仍然活着,例如waitpid().假设您选择了 ZeroMQ 作为您的 Actor 模型库;要"杀死"该分离的线程,您需要通过 ZeroMQ"套接字"向它发送命令。收件人线程将收到该消息,理解它意味着"死亡",并在终止自身之前执行所需的任何清理操作。就在它自我终止之前,它会在另一个"套接字"上向您发回确认,是的,它已经死了(或者至少即将死了,所有必要的清理都已经发生了(。

Actor 模型/CSP 编程强调让循环响应来自一个或多个源的消息。好吧,你自己的代码片段暗示了一个循环,等待pthread_cancel()生效。

我将"套接字"放在引号中,因为 ZeroMQ 套接字下方可以是 tcp 套接字、ipc、一些进程内存传输等;它们的行为都是一样的。过程中自然非常快。

Actor模型和通信顺序进程之间的区别在于,在Actor模型中,当发送消息时,发送方没有可用的信息表明它已被接收,而在通信顺序进程中,成功的发送=已完成的读取。就个人而言,我更喜欢后者 - 然后您的代码完全了解消息收件人必须到达的位置;发送/接收是Execution Rendezvous。因此,当您发送"终止"消息时,您确定收件人线程已收到该消息,并且现在正在对其执行操作。当收件人发送"我死了"确认时,它知道命令线程已收到该确认。

仅供参考,CSP在实时系统中非常有用,不是因为它更快,而是因为您的程序可以更好地了解它是否跟上实时需求。 Actor 模型可让您"隐藏"实时不足,例如通信链路中的延迟。

最新更新