考虑一个多线程 Windows 服务器应用程序。为了一般性起见,我们假设所有线程都运行相同的函数:
DWORD WINAPI threaded_function(LPVOID p)
{
while (TRUE) { // do things }
}
此外,假设我们保留所有这些线程的引用。 优雅终止的最佳实践是什么? (请记住,作为一项服务,我们在未知数量的服务之间共享一个进程,并且任何类型的进程终止方法都是不可能的)
我最好的猜测是:
更改
while (TRUE)
语句,使用while(global_event.not_signaled() )
(其中 global_event
是一个实例包装Win32
Event
对象的类和调用的方法是显而易见的)现在,实现终止函数如下:
global_event.set(); Sleep(/* 在这里等待的合理时间是多少?*/); thread_container.terminate_all();
我们的限制是应用程序最终必须完成所有线程的执行,并释放所有VM和资源,其中包括线程的内核对象。
有没有更好的方法来做到这一点?指定的方法有什么缺点吗?
最佳答案
您可以创建一个互斥体并将其放在调用者线程上,例如:
void caller(){
HANDLE mutex;
CreateMutex(mutex);
WaitForSingleObject(mutex); // take the mutex ownership
createThread(threadedfunction, mutex);
// do things
ReleaseMutex(mutex);
//end
}
并在您的线程函数上等待释放,例如:
void threadefunction(HANDLE mutex){
while(WaitForSingleObject(mutex,1)==WAIT_TIMEOUT){
// do things
}
ReleaseMutex(mutex);
}
这样,当无法获取互斥锁时,线程函数将继续运行,waitforsingleobject 将在一毫秒的等待时间内超时并执行操作,直到它可以获取互斥锁并退出。
关于c - 线程的优雅终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20226413/