优雅终止线程

时间:2013-11-26 19:40:12

标签: c multithreading winapi

考虑多线程Windows服务器应用程序。为了一般性,让我们假设所有线程都运行相同的函数:

DWORD WINAPI threaded_function(LPVOID p)
{
  while (TRUE) { // do things } 
}

另外,假设我们保留所有这些线程的引用。 优雅终止的最佳做法是什么? (请记住,作为一项服务,我们在未知数量的服务之间共享一个流程,并且任何类型的流程终止方法都是不可能的)

我最好的猜测是:

  1. 使用while (TRUE)更改while(global_event.not_signaled() )语句(where global_event是包装Win32 Event对象的类的实例和方法叫得很明显)

  2. 现在,实现终止功能如下:

    global_event.set();  睡觉(/ *在这里等待的时间是合理的?* /);  thread_container.terminate_all();

  3. 我们的限制是,应用程序必须最终完成所有线程的执行,并释放其中所有的VM和资源,其中包括线程的内核对象。

    有没有更好的方法呢?在指定的方法中有任何缺点吗?

1 个答案:

答案 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会在一个毫秒的等待时间内超时并做一些事情,直到它可以取出互斥锁并退出。