Нужна помощь для отладки взаимоблокировки mutex - PullRequest
3 голосов
/ 07 марта 2012

У меня есть взаимная блокировка мьютекса в следующем коде:

CRegistry::CRegistry()
{
    pthread_mutex_init(&_Mutex, NULL);
}

CRegistry::~CRegistry()
{
    pthread_mutex_destroy(&_Mutex);
}

MR_RESULT CRegistry::Register(const REGISTRY_KEY &Id, const REGISTRY_ITEM &Item)
{
    pair<REGISTRY::iterator, bool> Result;

    pthread_mutex_lock(&_Mutex);
    Result = _Registry.insert(pair<REGISTRY_KEY, REGISTRY_ITEM>(Id, Item));
    pthread_mutex_unlock(&_Mutex);

    if (Result.second == true)
        return MR_RESULT_OK;
    else
        return MR_RESULT_ERROR;
}

MR_RESULT CRegistry::UnRegister(const REGISTRY_KEY &Id)
{
    REGISTRY::size_type Result;

    pthread_mutex_lock(&_Mutex);
    Result = _Registry.erase(Id);
    pthread_mutex_unlock(&_Mutex);

    if (Result == 1)
        return MR_RESULT_OK;
    else
        return MR_RESULT_ERROR;
}

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

Существуют потоки как реального, так и не реального времени, блокирующие мьютекс.Я понимаю, что может быть инверсия приоритетов, но как это может привести к блокировке?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

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

В набор инструментов Valgrind входит Helgrind , отладчик pthread, который может помочь вам устранить тупики. Может быть, вы могли бы запустить его.

0 голосов
/ 07 марта 2012

Вы уверены, что существует тупик или просто поток, длительно заблокированный другими потоками с более высоким приоритетом?

Вы изучили использование

pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_INHERIT)

чтобы избежать проблемы инверсии приоритетов?

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