Определить поток, который удерживает блокировку файла - PullRequest
0 голосов
/ 10 ноября 2009

Я знаю, что нет WINAPI, который бы это делал, но если поток завис и держит открытый дескриптор файла. как определить идентификатор потока и завершить его в наших процессах.

Я не говорю о снятии блокировок файлов в других процессах, но в моем собственном процессе.

также возможно, что поток потерпел крах / прервался без закрытия дескриптора.

Ответы [ 4 ]

0 голосов
/ 12 ноября 2009

Вы не можете определить, какой поток содержит открытый дескриптор файла. Почти все дескрипторы ядра, включая файловые дескрипторы, связаны не с потоком, а только с процессом (мьютексы являются исключением - они имеют концепцию собственного потока).

Предположим, у меня есть следующий код. Какой нить "владеет" дескриптором файла?

void FuncCalledOnThread1()
{
     HANDLE file = CreateFile(...);

     // Hand off to a background thread.
     PostWorkItemToOtherThread(FuncCalledOnThread2, file);
}

void FuncCalledOnThread2(HANDLE file)
{
       DoSomethingWithFile(file);
       CloseHandle(file);
}
0 голосов
/ 10 ноября 2009

Вы можете присоединиться к процессу с помощью отладчика, когда это произойдет, приостановить программу, найти поток, вызвавший это, и, пройдя по стеку, выяснить, что он делает, какой код он выполняет и какие переменные включены стек.

Если вы использовали RAII для блокировки, этого должно быть достаточно, так как блокировка должна быть в стеке.

0 голосов
/ 10 ноября 2009

Я не видел ничего, что просматривало MSDN, хотя наверняка есть что-то недокументированное, которое может дать вам необходимую информацию.

Если ваши потоки создают эти ресурсы, и есть вероятность, что один из этих потоков может пойти на обед, имело бы для них больше смысла запрашивать ресурсы из потока утилит, единственной задачей которого является создание и удаление ресурсов ? Такой поток вряд ли потерпит крах, и вы всегда будете знать, в случае сбоя, что поток ресурсов действительно является владельцем этих дескрипторов.

0 голосов
/ 10 ноября 2009

Использовать Process Explorer - http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx [править или обрабатывать - http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...