我知道没有WINAPI会这样做,但是如果一个线程被挂起并且持有一个打开的文件句柄。我们如何确定线程ID并在我们的进程中终止它。
我不是在谈论在其他进程中释放文件锁,而是在我自己的进程中。
线程也可能在没有关闭句柄的情况下崩溃/终止。
答案 0 :(得分:0)
使用Process Explorer - http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx [编辑或处理 - http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx]
答案 1 :(得分:0)
当发生这种情况时,您可以使用调试器附加到进程,暂停程序,搜索导致该程序的线程,并遍历堆栈,找出它正在做什么,它执行哪些代码以及哪些变量在堆栈。
如果您使用RAII进行锁定,这应该足够了,因为锁必须在堆栈上。
答案 2 :(得分:0)
我没有看到任何浏览MSDN的内容,虽然肯定有一些可能没有记录的内容可以为您提供所需的信息。
如果您的线程正在创建这些资源,并且期望其中一个线程可能会出去吃午餐,那么它们是否更有意义从实用程序线程查询资源,其唯一的工作是创建和处理资源?这样的线程不太可能崩溃,并且在崩溃的情况下,您总是知道资源线程实际上是这些句柄的所有者。
答案 3 :(得分:0)
您无法确定哪个线程拥有文件的打开句柄。几乎所有内核句柄(包括文件句柄)都不与线程相关联,而只与进程相关联(互斥体是一个例外 - 它们具有拥有线程的概念。)
假设我有以下代码。哪个帖子“拥有”文件句柄?
void FuncCalledOnThread1()
{
HANDLE file = CreateFile(...);
// Hand off to a background thread.
PostWorkItemToOtherThread(FuncCalledOnThread2, file);
}
void FuncCalledOnThread2(HANDLE file)
{
DoSomethingWithFile(file);
CloseHandle(file);
}