2012-02-25 155 views
3

我正在设计一个线程库。到目前为止,我有一个方法来初始化库,一个创建线程,另一个产生当前线程到就绪线程队列中的下一个线程。如何知道何时杀死线程?

在我开始为线程实现信号量之前,我想我应该尽快杀死线程并释放它们分配的内存,但是我很难找出如何做到这一点。如何判断线程何时“完成”?

+4

当他们从线程程序返回或调用相当于POSIX的'pthread_exit'的库函数时如何?另外你为什么重新发明轮子? – 2012-02-25 01:46:00

+2

这非常依赖于操作系统。但强行杀死一个线程是最后的选择。一般而言,您只需让线程自然返回。 – 2012-02-25 01:48:13

回答

4

你不只是杀死线程安全或可靠 - 让他们自然退出(当他们的入口返回)。

虽然系统提供了杀死线程的手段,但是如果要继续的话,几乎任何C++程序都可能会出现未定义的行为。你可以想象一下,杀死可能会产生没有副作用(对程序的其余部分),但该程序根本不像习惯C++。这样的计划将是非常奇特的,有许多不寻常和严格的限制。

当您想知道某个线程是否退出或退出时,您可以在退出之前添加一些清理以追踪其状态。

当您希望能够请求线程退出(自然)时,请考虑运行循环和消息。

0

当他们完成运行他们的分叉过程时,你不会显式地终止这些线程,因为这样做的代码仍然会在要被终止的线程的上下文中。

您有一个调度程序/中断处理程序,它处理线程的上下文切换并维护一些队列用于管理此线程。你可以让它保存对被杀线程的引用,例如scheduler->SetThreadToKill(currentThread);,里面可能是你的finish()方法(或类似的),它为相应的线程设置一个标志。

当发生上下文切换,并且已将当前线程的所有数据结构与下一个线程的所有数据结构换出时,调度程序可以为所有设置了toBeKilled标志的线程调用析构函数。

0

到目前为止,杀死线程的最佳策略是不明确地去做(除非你是一个操作系统,即在应用程序关闭时)。将消息和任务排队到围绕某个队列执行更多工作的线程。如果你不写任何代码来不断地创建,创建,启动,终止,删除,测试,检查,登记,除名,入队,出队和微管理线程,那么该代码不能包含错误。