我有一些靜態的用戶數據,如:升壓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 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
我該怎麼辦?
我搜索了很多,但我沒有運氣。
謝謝。
彼得
嗯,我從EINVAL的解釋:http://linux.die.net/man/3/pthread_mutex_lock –
異常只能在我進行負載測試時拋出。如果我使用Valgrind的,我懷疑這會是超級慢,Valgrind的肯定會影響程序本身。但我會嘗試。 –
@Peter李:讀那一頁上兩行。 –