Выяснение статусов активных тем из текущего потока.(Внедрение робастных мьютексов) - PullRequest
3 голосов
/ 22 июня 2011

Мы пытаемся перенести некоторый код из Solaris в HPUX.В то время как Solaris использует свой собственный API потоков, HPUX использует API Pthread.Одна проблема, с которой мы столкнулись во время миграции, заключается в том, что надежные мьютексы не внедряются в HPUX, поскольку их не нужно было поддерживать, чтобы они оставались POSIX-совместимыми.

Мы попытались использовать pthread_mutex_trylock, чтобы потоки в очереди ожидания не блокировались.Мы хотим каким-то образом выяснить, жив ли поток, являющийся владельцем мьютекса.Как я могу получить статус этого потока из вызывающего потока?

За тонну заранее, Адитья.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

К сожалению, подход Энтони имеет несколько условий гонки:

  1. Существует промежуток времени между потоком, получающим мьютекс и сохраняющим себя как владельца. Если другой поток завершается неудачно при попытке блокировки и хочет проверить владельца, он может обнаружить, что владелец все еще не записан. В этом случае он может ждать в надежде, что владелец напишет свою личность, но если владелец умер в самый подходящий (неправильный) момент, ожидание будет в тупике.
  2. Независимо от того, какой идентификатор владельца хранится в мьютексе, он может быть переназначен после смерти владельца. Обратите внимание, что хранение только идентификатора потока было бы бесполезным, поскольку идентификаторы потока не являются уникальными для всех процессов, а надежная семантика мьютекса имеет смысл только для мьютексов, совместно используемых процессами. (В рамках одного процесса у вас есть полный контроль над завершением потока; они не могут завершиться непредсказуемо, поэтому вы можете просто правильно очистить потоки и освободить их мьютексы при выходе.) Если вы используете PID, единственная ситуация, где вы можете избежать Переназначение PID происходит, если этот процесс является вашим собственным дочерним процессом, и вы еще не ожидали его.

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

1 голос
/ 22 июня 2011

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

Если вы хотите узнать эту информацию, вам придется хранить ее самостоятельно - сразу послеБлокируя мьютекс, сохраните где-нибудь идентификатор потока, а затем очистите это значение, прежде чем разблокировать мьютекс.Эти хранилища должны быть либо атомарными, либо самим защищаться мьютексом (очевидно, если вы используете мьютекс, вы не сможете проверить наличие проблем с этим мьютексом или у вас возникнет проблема рекурсии).Затем вы можете использовать этот сохраненный идентификатор потока, чтобы проверить, является ли поток живым.

Это предполагает, что (a) ваш поток не умрет между получением мьютекса и установкой владельца, и (b) идентификатор потокане используется повторноОн также закрывает часть «проверить, жив ли поток» - это само по себе не тривиально.

Если вы предполагаете, что поток может умереть в любой момент, тогда создание «надежных мьютексов» недействительно возможно без поддержки ОС.

...