确定保存锁定文件的线程

时间:2009-11-10 18:53:28

标签: c++ file winapi multithreading locking

我知道没有WINAPI会这样做,但是如果一个线程被挂起并且持有一个打开的文件句柄。我们如何确定线程ID并在我们的进程中终止它。

我不是在谈论在其他进程中释放文件锁,而是在我自己的进程中。

线程也可能在没有关闭句柄的情况下崩溃/终止。

4 个答案:

答案 0 :(得分:0)

答案 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);
}