我如何(安全地)中断单独线程上的计算?

How can I (safely) interrupt a computation on a separate thread?

我有一个程序使用第 3 方库进行一些计算,我在与主应用程序不同的线程上启动该程序。 不幸的是,此计算可能需要很长时间,并且不提供进度更新和取消的界面。

为了拥有这样的界面,我想创建一个 "Cancel" 按钮,它应该立即终止计算(并丢弃所有结果)。

我需要一些帮助(-代码剪断表示赞赏-)如何最好地设置和干净地执行。是'safe'做的吗?

我目前正在使用 AfxBeginThread() 启动进程。

销毁(或暂停)不是 运行 您的代码的线程是破坏程序的练习。

如果线程内有代码

EnterCriticalSection( &cs );
// do something
LeaveCriticalSection( &cs );

那么资源cs将永久归销毁(或暂停线程)所有。当其他地方需要资源时,这将死锁。

如果线程正在创建其他资源,例如文件、共享内存,这些也可能会泄漏,从而增加您的程序的不稳定性。

如果线程有取消回调,应该使用它。我也尝试过错误注入的形式,当线程请求数据时,这些最终成为 "testing" 第三方代码,使其执行未经测试和错误的路径。

与供应商联系并要求取消方法,或寻找替代方法。

我建议生成一个子进程来执行这些长时间的计算。与线程不同,进程可以终止而不会对主应用程序产生负面影响。这种方法还将在第三方代码出现严重错误时保护主应用程序,例如否则会终止它的访问冲突。