在 std::map clear() 中崩溃 - 多线程
crash in std::map clear() - multithreading
我在多线程应用程序中遇到奇怪的崩溃:
static std::map<int, std::string> g_params;
Thread 1
(void)lock(map_mutex);
g_params[iParamID] = sValue;
(void)unlock(map_mutex);
Thread 2
(void)lock(map_mutex);
std::map<int, std::string>::iterator it;
for (it = g_params.begin(); it != g_params.end(); ++it)
{
// process it->first and it->second, w/o modifying them
}
g_params.clear(); // the crash occurs here: #5 0x76a3d08c in *__GI___libc_free (mem=0x703070c8) at malloc.c:3672
//#14 std::map<int, std::string, std::less<int>, std::allocator<std::pair<int const, std::string> > >::clear (this=0xb4b060)
(void)unlock(map_mutex);
其中 lock 和 unlock 是:
int lock(pthread_mutex_t mutex)
{
return pthread_mutex_lock(&mutex);
}
int unlock(pthread_mutex_t mutex)
{
return pthread_mutex_unlock(&mutex);
}
崩溃的发生非常罕见,很难预测重现它的场景。互斥体应该保证映射不会从一个线程更改为另一个线程,对吗?
我的猜测是您正在复制您的互斥体,也许这会阻止它作为一个整体工作。尝试使用指针:
int lock(pthread_mutex_t* mutex)
{
return pthread_mutex_lock(mutex);
}
int unlock(pthread_mutex_t* mutex)
{
return pthread_mutex_unlock(mutex);
}
编辑
或者,参考文献似乎也可以:
int lock(pthread_mutex_t& mutex)
{
return pthread_mutex_lock(&mutex);
}
int unlock(pthread_mutex_t& mutex)
{
return pthread_mutex_unlock(&mutex);
}
我在多线程应用程序中遇到奇怪的崩溃:
static std::map<int, std::string> g_params;
Thread 1
(void)lock(map_mutex);
g_params[iParamID] = sValue;
(void)unlock(map_mutex);
Thread 2
(void)lock(map_mutex);
std::map<int, std::string>::iterator it;
for (it = g_params.begin(); it != g_params.end(); ++it)
{
// process it->first and it->second, w/o modifying them
}
g_params.clear(); // the crash occurs here: #5 0x76a3d08c in *__GI___libc_free (mem=0x703070c8) at malloc.c:3672
//#14 std::map<int, std::string, std::less<int>, std::allocator<std::pair<int const, std::string> > >::clear (this=0xb4b060)
(void)unlock(map_mutex);
其中 lock 和 unlock 是:
int lock(pthread_mutex_t mutex)
{
return pthread_mutex_lock(&mutex);
}
int unlock(pthread_mutex_t mutex)
{
return pthread_mutex_unlock(&mutex);
}
崩溃的发生非常罕见,很难预测重现它的场景。互斥体应该保证映射不会从一个线程更改为另一个线程,对吗?
我的猜测是您正在复制您的互斥体,也许这会阻止它作为一个整体工作。尝试使用指针:
int lock(pthread_mutex_t* mutex)
{
return pthread_mutex_lock(mutex);
}
int unlock(pthread_mutex_t* mutex)
{
return pthread_mutex_unlock(mutex);
}
编辑
或者,参考文献似乎也可以:
int lock(pthread_mutex_t& mutex)
{
return pthread_mutex_lock(&mutex);
}
int unlock(pthread_mutex_t& mutex)
{
return pthread_mutex_unlock(&mutex);
}