Проверьте, не блокирует ли поток - PullRequest
1 голос
/ 23 сентября 2011

Вот ситуация, у меня работает поток, который частично контролируется кодом, который мне не принадлежит.Я запустил поток, поэтому у меня есть его идентификатор, но затем я передал его другому коду.Мне нужно иметь возможность сказать, вызвал ли этот другой код поток в данный момент из другого потока, которым я управляю.Есть ли способ сделать это в pthreads?Я думаю, что ищу что-то эквивалентное методу getState () в классе Thread Java (http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState()).

-------------- Edit -----------------

Это нормально, если решение зависит от платформы.Я уже нашел решение для Linux с использованием файловой системы / proc.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Вы можете написать обертки для некоторых функций pthreads, которые просто обновят некоторую информацию о состоянии до / после вызова исходных функций. Это позволит вам отслеживать, какие потоки работают, когда они получают или удерживают мьютексы (и какие), когда они ожидают, какие переменные условия и т. Д.

Конечно, это говорит вам, только когда они заблокированы на объектах синхронизации pthreads - это не скажет вам, когда они блокируют что-то еще.

0 голосов
/ 23 сентября 2011

Прежде чем передать поток другому коду, установите флаг, защищенный мьютексом.Когда поток вернется из кода, который вы не контролируете, снимите флажок, защищенный мьютексом.Затем вы можете проверить, где вам нужно, находится ли поток в коде, который вы не контролируете.

За пределами кода нет различия между заблокированным и неблокированным.Если вы буквально проверили состояние потока, вы получите бессмысленные результаты.

Например, рассмотрим две реализации библиотеки.

A: Мы выполняем всю работу в вызывающем потоке.

B: Мы отправляем рабочий поток для выполнения работы.Вызывающий поток блокируется до завершения рабочего процесса.

В обоих случаях A и B код, который вы не контролируете, одинаково продвигается вперед.Ваша идея о получении статуса даст разные результаты.Так что это не то, что вы хотите.

...