一个由于锁的作用域导致core dump的问题的解决
2014-04-22 11:35
471 查看
请看如下代码:
问题的提出:
在多线程环境下, 如果又多个线程同时调用以上函数setParams,发现总是core dump.
通过gdb bt发现,问题本质原因是由于多个线程对m_Usr等同时写入,如m_szUsrName = authUser,竞争导致的crash。
可奇怪的是,在写入或赋值前,我们已经加锁了啊!百思不得其解。
问题的解决:
通过走读代码,发现了一行可疑点:
boost::mutex::scoped_lock(m_runtimeMutex);
正常情况下,我们都是这样使用:
boost::mutex::scoped_lock Lock(m_runtimeMutex);
即会定义一个临时变量 Lock.
这2者有何不同呢。如果定义了Lock变量,那么它的作用域为整个函数域,即从{开始,到}结束,这样mutex就起到了保护数据同时写入竞争的作用;
那么是否没有Lock变量情况下,scoped_lock的作用域仅仅是到该行的“;”就结束了呢?
为了验证这个想法,我写了如下代码,通过对象何时析构来证实该想法:
果不其然,my("1")这个对象在分号;结束之后就进行了析构,而tmp对象直到main函数结束之后才析构。
void CCommParams::setParams( const char * authUser, const char * authPsw, const char * securityLevel, const char * portNumber) { boost::mutex::scoped_lock(m_runtimeMutex); std::string SecLevel = (NULL == securityLevel)? "" : securityLevel; std::string nPort = (NULL == portNumber)? 0 : atoi(portNumber); std::string AuthUsr = (NULL == authUser)? "" : authUser; std::string AuthPwd = (NULL == authPsw)? "" : authPsw; m_szSecLevel =SecLevel; m_szUsrName = authUser; m_szPwd =authPsw; m_dwPort = nPort; }
问题的提出:
在多线程环境下, 如果又多个线程同时调用以上函数setParams,发现总是core dump.
通过gdb bt发现,问题本质原因是由于多个线程对m_Usr等同时写入,如m_szUsrName = authUser,竞争导致的crash。
可奇怪的是,在写入或赋值前,我们已经加锁了啊!百思不得其解。
问题的解决:
通过走读代码,发现了一行可疑点:
boost::mutex::scoped_lock(m_runtimeMutex);
正常情况下,我们都是这样使用:
boost::mutex::scoped_lock Lock(m_runtimeMutex);
即会定义一个临时变量 Lock.
这2者有何不同呢。如果定义了Lock变量,那么它的作用域为整个函数域,即从{开始,到}结束,这样mutex就起到了保护数据同时写入竞争的作用;
那么是否没有Lock变量情况下,scoped_lock的作用域仅仅是到该行的“;”就结束了呢?
为了验证这个想法,我写了如下代码,通过对象何时析构来证实该想法:
#include <stdio.h> #include <string> using namespace std; class my { public: my(const std::string & name) { m_name = name; printf("create [%s]\n", m_name.c_str()); } virtual ~my() { printf("destroy [%s]\n", m_name.c_str()); } private: std::string m_name; }; int main(int argc, char** argv) { my("1"); my tmp("2"); printf("function end\n"); return 0; }
果不其然,my("1")这个对象在分号;结束之后就进行了析构,而tmp对象直到main函数结束之后才析构。
相关文章推荐
- 一个由于锁的作用域导致core dump的问题的解决
- maven项目由于多个依赖中含有同一个jar包导致的冲突问题的解决办法
- DB2问题诊断与解决: 一个由于历史文件过大,导致LOAD慢的问题
- 解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
- 一个“>”导致我调试了1个小时才解决问题
- Kafka由于ext4的日志问题导致IO.WAIT升高的解决办法
- 解决Oracle中字符集导致一个汉字占用3个字节的问题
- 解决kernel编译时由于加入git管理导致的version magic的问题
- 重复insmod 一个ko模块导致的异常问题解决方法
- IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决
- 安全狗导致IIS Worker Process 遇到了一个问题和错误模块 ntdll.dll的解决方法
- 在家看一个cms的源代码,发现导航栏由于栏目太多不能显示的问题,在网上找的解决办法
- 转:解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- 解决由于使用代理服务器导致Foxmail无法收发邮件的问题
- 一个“>”导致我调试了1个小时才解决问题
- 由于teamid问题导致不能真机测试解决办法
- 由于NFS服务没有启动,导致XenServer 6.5无法连接NAS存储问题的解决方法
- 在Mybatis-spring中由于默认Autowired导致不能配置多个数据源的问题分析及解决
- 解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”