考虑多线程Windows服务器应用程序。为了一般性,让我们假设所有线程都运行相同的函数:
DWORD WINAPI threaded_function(LPVOID p)
{
while (TRUE) { // do things }
}
另外,假设我们保留所有这些线程的引用。 优雅终止的最佳做法是什么? (请记住,作为一项服务,我们在未知数量的服务之间共享一个流程,并且任何类型的流程终止方法都是不可能的)
我最好的猜测是:
使用while (TRUE)
更改while(global_event.not_signaled() )
语句(where global_event
是包装Win32
Event
对象的类的实例和方法叫得很明显)
现在,实现终止功能如下:
global_event.set(); 睡觉(/ *在这里等待的时间是合理的?* /); thread_container.terminate_all();
我们的限制是,应用程序必须最终完成所有线程的执行,并释放其中所有的VM和资源,其中包括线程的内核对象。
有没有更好的方法呢?在指定的方法中有任何缺点吗?
答案 0 :(得分:1)
您可以创建互斥锁并将其置于调用者线程上,例如:
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会在一个毫秒的等待时间内超时并做一些事情,直到它可以取出互斥锁并退出。