c - 线程的优雅终止

标签 c multithreading winapi

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

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

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

我最好的猜测是:

  1. 更改 while (TRUE) 语句,使用 while(global_event.not_signaled() ) (其中 global_event 是一个实例包装 Win32 Event 对象的类和调用的方法是显而易见的)

  2. 现在,实现终止函数如下:

    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/

相关文章:

c - 将字符串与指针数组分开

c - fork() 的子进程过多

msbuild - 如何在 MSBuild 中获取 Windows SDK 文件夹?

c++ - 如何在 Linux 中找到具有写时复制的 fork 进程之间共享多少内存?

c - 如何在 C 中使用函数(初学者)

java - 这个在单独线程上绘图的具体示例有什么问题?

java - 如何在java中建立线程套接字连接?

java - 这个例子中有竞争条件吗?如果是这样,如何避免?

c - 使用 _tprintf 错误地打印出二进制文件

javascript - 在 64 位环境中加载 32 位进程