2013-04-07 2 views
1

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

Верхняя трассировку является

#0 0xb6adfc6d in pthread_mutex_lock() from /usr/lib/libpthread.so.0 
#1 0x080d8565 in boost::mutex::lock()() 
#2 0x080d8613 in boost::unique_lock<boost::mutex>::lock()() 
#3 0x080d8642 in boost::unique_lock<boost::mutex>::unique_lock(boost::mutex&) 
#4 0x...  in ??? //just ??? in stack 
#5 0x...  in ??? 
#6 0x...  in ??? 

кажется мьютекс не существует, но он создается в классе застройщик. Пример:

class A 
{ 
    boost::mutex::scoped_lock mutex_; 
public: 
    A(): mutex_() {} 

    void Read (...) 
    { 
    //some checks 
    boost::mutex::scoped_lock lock(mutex_); // <-- Segfault 
    //read 
    } 

    void Write (...) 
    { 
    //some checks 
    boost::mutex::scoped_lock lock(mutex_); 
    //write 
    } 
}; 

Это кажется странным для меня, потому что я понятия не имею, причину Segfault или возможные способы, чтобы найти причину. Я был бы рад услышать ваши советы об этом.

+1

Скомпилируйте свой код с включенной информацией об отладке (опция -g для GCC и clang) и снова запустите. Вы должны, надеюсь, получить больше информации в этом обратном направлении. –

+3

Что касается сбоя, вы уверены, что вы вызываете функцию 'Read' на действительном объекте? То есть не объект, который вы удалили, или с помощью указателя/ссылки на локальную переменную, возвращаемую из какой-либо функции? Вероятно, вы должны предоставить больше информации, например, как создается объект или откуда вы его получите. –

+0

Спасибо, я обращу внимание на это, скажем, о результатах. – Torrius

ответ

1

Это выглядит, как вы сфера блокировки замка области видимости - это, вероятно, опечатка

случайный пример использования: http://www.boost.org/doc/libs/1_53_0/libs/thread/example/mutex.cpp

Обычная картина размаху мьютекс, используя класс scoped_lock

boost::recursive_mutex mutex; 
void somefunc() { 
    boost::unique_lock<boost::recursive_mutex> scoped_lock(mutex); 
} 
Смежные вопросы