我正在设计一个线程库。到目前为止,我有一个初始化库的方法,一个创建线程的方法,一个将当前线程生成到就绪线程队列中的下一个方法的方法。
在我继续为线程实现信号量之前,我想我应该尽快杀死线程并释放他们分配的内存,但我无法弄清楚如何做到这一点。如何判断线程何时“完成”?
答案 0 :(得分:4)
你不仅要安全或可靠地杀死线程 - 让它们自然退出(当它们的条目返回时)。
虽然系统提供了一种杀死线程的方法,但几乎任何C ++程序都可能出现未定义的行为,如果要继续的话。您可以设想杀死可以完成而没有副作用(对程序的其余部分)的情况,但该程序根本不像惯用的C ++。这样的程序非常具有异国情调,有许多不寻常和严格的限制。
如果您想知道线程何时退出,可以在退出之前添加一些清理以跟踪其状态。
如果您希望能够自然地请求线程退出,请考虑运行循环和消息。
答案 1 :(得分:0)
当完成运行forked过程时,你没有显式地杀死线程,因为那些将要执行的代码仍然存在于要被杀死的线程的上下文中。
您有一个调度程序/中断处理程序,它处理线程的上下文切换并维护一些队列来管理它。你可以让它保存对要被杀死的线程的引用,例如scheduler->SetThreadToKill( currentThread );
内部可能是你的finish()
方法(或类似方法),它为相应的线程设置了一个标志。
当发生上下文切换,并且您已将当前线程的所有数据结构换成下一个线程的数据结构时,调度程序可以为所有设置了toBeKilled
标志的线程调用析构函数。 / p>
答案 2 :(得分:0)
到目前为止,杀死线程的最佳策略是不明确地执行它(除非您是操作系统,即在应用程序关闭时)。将消息和任务队列到循环某个队列以执行更多工作的线程。如果你没有编写任何代码来不断创新,创建,启动,终止,删除,测试,检查,登记,退市,入队,出列和以其他方式微观管理线程,那么该代码就不能包含错误。