Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查分离的pthread是否仍处于活动状态?_C++_Multithreading_Sockets_Pthreads_Posix - Fatal编程技术网

C++ 检查分离的pthread是否仍处于活动状态?

C++ 检查分离的pthread是否仍处于活动状态?,c++,multithreading,sockets,pthreads,posix,C++,Multithreading,Sockets,Pthreads,Posix,我正在为一个多线程套接字编程项目使用POSIX线程。我遇到了一种情况,需要使用setdetachstate()从主程序中分离线程;然而,后来我取消了线程(我知道取消通常是不好的做法,但我知道我在做什么(希望如此))。我需要一种方法来检查线程是否仍然处于活动状态,在做了一些研究之后,我发现waitpid()可能适合我的目的,即使我有一个TID而不是PID。然而,在试用了它之后,无论是使用还是不使用ptraces,它都不起作用。我在Internet上随处可见的另一种方法是pthread\u join

我正在为一个多线程套接字编程项目使用POSIX线程。我遇到了一种情况,需要使用
setdetachstate()
从主程序中分离线程;然而,后来我取消了线程(我知道取消通常是不好的做法,但我知道我在做什么(希望如此))。我需要一种方法来检查线程是否仍然处于活动状态,在做了一些研究之后,我发现
waitpid()
可能适合我的目的,即使我有一个TID而不是PID。然而,在试用了它之后,无论是使用还是不使用
ptrace
s,它都不起作用。我在Internet上随处可见的另一种方法是
pthread\u join()
。虽然我同意这是最好的方法,但正如我所说,我的线程是分离的,所以不能连接

作为旁注,我的目标是找到一种方法,在执行任何后续代码之前,等待函数调用
pthread\u cancel()
完成

pthread_t tid;
// ...
pthread_cancel(tid);
// wait until pthread with ID tid is cancelled
// more code here...
最初,我需要检查分离的pthread是否处于活动状态的原因是因为我计划执行以下操作:
while(!pthread_dead(tid))或类似的东西;但是,如果有一个解决方案直接等待取消完成,那就更好了。请尽量不要批评我使用分离线程或pthread取消;我已经考虑了许多行动计划,无论我怎么做,这似乎都是必需的(除非我正在做一个多进程的应用程序,我不想这样做)。除非我在做一些在句法上或结构上绝对令人讨厌的事情,如果你能回答我的问题,我将不胜感激

谢谢大家!


<> P.S.我用C++编写代码。

< P>你有没有想过使用Actudio模型编程,或者更好地通信顺序进程? 当你有一个单独的线程需要去做它自己的事情,并且你需要能够告诉它一些事情并得到一个答案时,这确实是一个很好的模型

显然,您需要知道某个异步线程已经完成(一个单独线程的终止)——让该线程直接向您发送对其终止的确认没有什么错,而不是试图通过稍微不确定的方式(例如
waitpid()
)来确定它是否仍然处于活动状态。假设您选择ZeroMQ作为参与者模型库;要“杀死”那个分离的线程,您需要通过ZeroMQ“套接字”向它发送一个命令。接收者线程将接收该消息,理解它的意思是“死”,并在终止自身之前进行必要的清理。就在它自身终止之前,它会在另一个“套接字”上向您发送一个确认信息,确认是的,它已经死了(或者至少即将死了,所有必要的清理都已经发生了)

Actor模型/CSP编程强调让一个循环响应来自一个或多个源的消息。好的,您自己的代码片段会提示一个循环,等待
pthread\u cancel()
生效

我在引号中加了“socket”,因为ZeroMQ套接字下面可以是tcp套接字、ipc、一些进程内内存传输等;它的行为都是一样的。In-proc自然是相当快的

参与者模型和通信顺序过程之间的区别在于,在参与者模型中,当发送消息时,发送方没有收到消息的可用信息,而在通信顺序过程中,成功发送=完成读取。就我个人而言,我更喜欢后者——你的代码就完全知道消息接收者要去哪里;发送/接收是执行集合
。因此,当您发送“terminate”消息时,您肯定知道收件人线程已收到该消息,并且正在对其执行操作。当接收者发送它的“我死了”确认时,它知道命令线程已收到该确认


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

“P.S.我在C++中编码。”为什么不使用C++标准线程设备来代替本地P线程函数?ῥεῖ 看来,在C++套接字编程中,p螺纹使用最多,至少在我所谈到的书籍和人员中。而且,我认为它有比
std::thread
更好的文档和社区。但有一段时间我在考虑使用它。另外,如果我因为某种原因回到C,我不必改变它。你是否考虑使用条件变量来协商线程的终止?JoahanDeLee,我不能同意你的论点。本地PcLoLIB实现可能考虑一些特定的OS功能,但通常并不抽象,足以耗尽特定OS提供的任何方面的设施。我只依赖C++机制库提供的一些同步机制的抽象。条件变量允许一个线程将信号发送到另一个线程,条件已经改变。使用条件变量,您可以设置线程停止的条件,然后线程完成后可以向您发出信号。感谢您回答实际问题并提供宝贵建议。@Jonathanley,别担心,祝您好运!请注意,如果您打算使用演员模型或CSP编程,最好是全程进行。也就是说,不要试图随意地将其与共享内存、信号或条件变量混合;它可能会变得非常混乱(尤其是信号;yeurk!)。这种总体转换可能是对应用程序体系结构的一个重大修订,因此值得进行一些阅读和仔细思考