2011-10-04 100 views
2

我有一些靜態的用戶數據,如:升壓lock_guard <提高::互斥>拋出異常EINVAL

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 EINVALThe 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

我該怎麼辦?

我搜索了很多,但我沒有運氣。

謝謝。

彼得

回答

3

其實,錯誤更可能是這一個:

的pthread_mutex_lock()的,pthread_mutex_trylock()和調用pthread_mutex_unlock()函數可能會失敗,如果:

[ EINVAL]
互斥量指定的值不引用初始化的互斥對象。

這通常是由內存損壞引起的。您可以嘗試在valgrind或類似工具下運行。

+0

嗯,我從EINVAL的解釋:http://linux.die.net/man/3/pthread_mutex_lock –

+0

異常只能在我進行負載測試時拋出。如果我使用Valgrind的,我懷疑這會是超級慢,Valgrind的肯定會影響程序本身。但我會嘗試。 –

+0

@Peter李:讀那一頁上兩行。 –

0

我想冒險猜測你遇到了靜態問題的初始化順序,從AddUserDataRemoveUserData調用不同的編譯單元。我跑審查單身實現here, with a link to a workaround時進入的問題,還討論here