Boost lock_guard <boost :: mutex> выдает исключение EINVAL - PullRequest
2 голосов
/ 04 октября 2011

У меня есть статические данные пользователя, такие как:

private:
    static std::map<unsigned long, UserDataSharedPtr> userStore_;
    static boost::mutex                               mutexUserData;

public:
    static void RemoveUserData(unsigned long id)
    {
        boost::lock_guard<boost::mutex> lock(mutexUserData);
        std::map<unsigned long, UserDataSharedPtr>::iterator it = userStore_.find(id);
        if (it != userStore_.end())
        {
            userStore_.erase(it);
        }
    }
    static void AddUserData(unsigned long id, UserDataSharedPtr ud)
    {
        boost::lock_guard<boost::mutex> lock(mutexUserData);
        userStore_.insert(std::make_pair(id, ud));
    }

А при нагрузочном тестировании моя программа вылетает на линии:

boost::lock_guard<boost::mutex> lock(mutexUserData);

За исключением:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'
  what():  boost::lock_error

Стек вызовов:

boost::mutex::lock() at mutex.hpp:55 0x81aeb22  
boost::lock_guard<boost::mutex>::lock_guard() at locks.hpp:257 0x81b2cb3    
..........RemoveUserData() at ..............:69 0x81b0b28   

И boost::mutex::lock() на mutex.hpp

pthread_mutex_t m;
void lock()
{
    int const res=pthread_mutex_lock(&m);
    if(res)
    {
        boost::throw_exception(lock_error(res));
    }
}

Здесь pthread_mutex_lock(&m) возвращает 22, и я проверяю, что 22 равно EINVAL: The mutex was created with the protocol attribute having the value PTHREAD_PRIO_PROTECT and the calling thread's priority is higher than the mutex's current priority ceiling

Что мне делать?

Я много гуглил, но мне не повезло.

Спасибо.

Peter

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

На самом деле, ошибка, скорее всего, будет такой:

Функции pthread_mutex_lock (), pthread_mutex_trylock () и pthread_mutex_unlock () могут завершиться ошибкой, если:

[EINVAL]
Значение, указанное в mutex, не относится к инициализированному объекту mutex.

Обычно это вызвано повреждением памяти. Вы можете попробовать запустить под valgrind или аналогичным инструментом.

0 голосов
/ 05 февраля 2014

Рискну предположить, что вы сталкиваетесь с порядком инициализации статической проблемы, когда AddUserData или RemoveUserData вызывается из разных модулей компиляции. Проблема, с которой я столкнулся при рассмотрении одноэлементной реализации здесь со ссылкой на обходной путь , также обсуждалась здесь .

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