交易是:
我想创build一个类似于在Windows中执行一个新的.exe的线程,所以如果这个程序(新线程)崩溃或进入无限循环:它将被优雅地杀死(超过时间限制或崩溃)和所有的资源都能正常释放。
当线程成功时,我想能够修改一些可能有一些数据的全局variables,例如文件列表。 这就是为什么我不能只是从Windows执行外部可执行文件,因为我不能访问执行到新线程的函数内部的variables。
编辑:澄清了更多的问题。
线程不是某种可以做事情的神奇对象。 这是通过你的代码执行的一个单独的路径。 你的代码不能在代码库中任意跳转,除非你专门编程。 即使如此,它只能在C ++规则(即:调用函数)内完成。
你不能杀死一个线程,因为杀死一个线程将完全破坏程序员所做的一些最基本的假设。 你现在不得不考虑下一行不能执行的可能性,因为你既不能预测也不能阻止。
这不像异常处理,C ++特别需要调用析构函数,并且有能力捕获异常并进行特殊的清理。 你正在谈论执行一段代码,然后突然结束整个调用堆栈的执行。 这是行不通的。
Web浏览器从“每个选项卡中的线程”移动到“每个选项卡的进程”模型的原因正是:因为可以终止进程而不会使其他进程处于未知状态。 你需要的是使用进程而不是线程。
当进程完成并设置数据时,您需要使用一些进程间通信系统来读取数据(我自己喜欢Boost.Interprocess)。 它看起来不像一个普通的C ++全局变量,但是读取它不会有问题。 这样,如果时间过长,就可以有效地杀死进程,并且程序将保持在合理的状态。
线程在调用CreateThread
之后已经运行。
WaitForSingleObject
是没有必要的(除非你真的想等待线程完成); 但它不会“强制退出”线程; 实际上,即使有可能,强制戒烟也不是一个好主意, 你可能会把资源开放,或者让你的应用程序处于不好的状态。
那么WaitForSingleObject
这样做的。 它阻塞,直到对象做了一些事情(如果线程等待,直到线程退出或超时过去)。 你需要的是
HANDLE thread = CreateThread(0, 0, do_stuff, NULL, 0, 0); //rest of code that will run paralelly with your new thread. WaitForSingleObject(thread, 4000); // wait 4 seconds or for the other thread to exit
删除对WaitForSingleObject的调用。 这会导致您的父线程等待。
删除WaitForSingleObject
调用?
如果你希望工作线程在一段时间过后关闭,最好的办法是让线程本身以某种方式监视经过的时间,然后在时间到了的时候退出。
另一种方法是监视主线程或甚至第三个监视器类型线程的运行时间。 当时间到了, 设置一个事件 。 你的工作线程可以在主循环中等待这个事件 ,然后当它被引发时退出。 这些用来表示线索自杀的事件有时被称为“死亡事件”。 (或者至少,我把它称为那个。)
另一种方法是将用户作业排队到工作线程,工作线程需要处于可变的等待状态 。 然后,APC可以设置一些内部的状态变量,它会在线程恢复时触发死亡序列。
还有一个我甚至不敢提的方法,因为它只能用在极端困难的情况下。 你可以杀死线程 。 这是一个非常危险的方法,类似于通过引爆原子弹来关闭你的水槽。 你关闭了水槽,但也可能会有其他意想不到的后果。 请不要这样做,除非你确切地知道你在做什么,为什么。