TerminateThread是个坏主意。 特别是线程使用互斥体等同步对象时。 因为它可能会引起未公开的内存和句柄,导致死锁,所以你是对的,你需要做别的事情。
通常,线程的结束由定义线程的函数返回。 主线程通过事件对象或简单的布尔值表示工作线程结束,并经常进行检查。 如果工作线程正在等待WaitForSingleObject,则必须将其更改为WaitForMultipleObjects。 其中一个是活动。 主线程调用SetEvent
除非我们让你看看你在做什么,否则我们不能提供真正有用的代码。根据工作线程在做什么以及主线程如何向它传递信息,它可能看起来很不一样
此外,“当前旧”] MSVC要求使用_beginthreadex而不是CreateThread,以避免CRT中的内存泄漏。 请参阅MSKB #104641。
更新:
工作线程的一个使用是计时器,定期执行一些操作。 最微不足道的事情:
for (; () )。
交换机(waitforsingleobject (kill _ event,timeout ) ) }
case wait _ time out :/* dotimeraction */break;
default :返回0;/*退出the thread * /
}
}
另一个用途是根据需要做某事。 基本上相同,但超时设置为INFINITE,对WAIT_OBJECT_0而不是WAIT_TIMEOUT执行特定操作。 在这种情况下,需要两个事件:一个启动线程并执行一些操作,另一个启动并退出。
handle handles [2]={ action _ handle,quit_handle };
for (; () )。
交换机(waitformultipleobject (handles,2,FALSE,INFINITE ) ) ) ) ) ) ) )。
case wait _ object _ 00:/* do action */break;
默认:
case wait _ object _ 01:/* quit */break;
}
}
请注意,如果WFSO/WFMO返回错误而不是预期结果之一,则循环将执行合理的操作。 在上面的两个例子中,我们只把一个错误视为错误信号。 这就像是被告知我们要结束。
通过从主线程关闭事件句柄,可以获得与第一个示例相同的结果。 因此,工作线程从WaitForSingleObject获取错误并退出,但不建议使用此方法。